将 HSTS header 添加到我的域,但如果请求是 API::P 请求则不添加 header

Add HSTS header to my domain but NOT add the header if the request is an API::P request

我在 location 使用了否定正则表达式,但它确实添加了 header 但删除了之前存在的所有其他内容。即使我添加它也不会只考虑其余的 hsts。我不确定执行此操作的最佳方法是什么。为其他任何东西添加 header,但“如果我们在 API::P 上,请不要添加此 HSTS header”。

location ~ (?!^/p/) {
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

location ~ ^(/p/) {
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

这是我想到的逻辑。

if location == "/p/":
    pass
else:
    add_header ...HSTS...

出于性能考虑,请尽可能避免使用正则表达式。要么使用两个位置复制所有其他不能移动到上一层的位置:

location / {
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    ... common configuration
}
location /p/ {
    ... common configuration
}

或使用 map 块(但这实际上至少会进行一次 PRCE 库调用):

map $uri $hsts {
    ~^/p/    "";
    default  "max-age=31536000; includeSubDomains";
}
server {
    ...
    add_header Strict-Transport-Security $hsts always;
    ...
}

如果 add_header 指令中使用的评估变量为空,nginx 将不会添加具有空值的 header - 相反它不会添加这样的 header完全没有。

对于 two-locations 配置,每个以 /p/ 开头的请求都将用 location /p/ { ... } 处理,每个其他请求都将用 location / { ... } 处理。对于这种特殊情况,绝对不需要使用任何正则表达式位置。

请注意,当且仅当当前级别上没有定义 add_header 指令时,add_header 指令才从以前的配置级别继承。