为不同的路径配置不同的标头,但最终总是提供相同的文件

为不同的路径配置不同的标头,但最终总是提供相同的文件

我想为不同的位置提供不同的标头,但回退到始终提供特定文件(如果找不到匹配的文件)。

location我还有一些需要添加到所有请求中的全局标头,但需要注意的是,如果它们已经在该级别添加,我就不想添加它们。

.template.conf我目前知道的是:

server {   
   listen   ${PORT};
   # Don't include any local server address info in redirects
   absolute_redirect off;

   index    index.html;

   root ${HTML_SRC};

   include  ${INCLUDE_DIR}/*.conf;
    
   # Serve any matching requested file (CSS, etc.) fallbacking to /index.html
   location / {
      # First try a matching existing file, then just show index.html
      try_files     $uri $uri/ /index.html;
   }
}

include中的定义INCLUDE_DIR/headers.conf为:

# Global headers
add_header  X-FRAME-OPTIONS "DENY"  always;
add_header  Cache-Control   "no-store, must-revalidate" always;
add_header  Report-To   "<global-config>" always;
add_header  Content-Security-Policy "<global-config>" always;

# Location specific paths

# Specific known existing file in /$HTML_SRC/.well-known
location /.well-known/apple-app-site-association$ {
    default_type    application/json;
    # Redirect everything to fallback / location to serve the file
    rewrite .* / last;
}

# Assets
location ~* \.(jpg|jpeg|gif|png|svg|ttf)$ {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Report-To   "<global-config>" always;
    add_header  Content-Security-Policy "<global-config>" always;
    # Cache assets for a bit longer
    add_header  Cache-Control   "max-age=31557600";
    # Redirect everything to fallback / location to serve any files file
    rewrite .* / last;
}

location = /login {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Cache-Control   "no-store, must-revalidate" always;
    # Path specific CSP headers
    add_header  Report-To   "<specific-config>" always;
    add_header  Content-Security-Policy "<specific-config>" always;
    # Redirect everything to /
    rewrite .* / last;
}

# All locations with this prefix have these headers
location /some-other-path {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Cache-Control   "no-store, must-revalidate" always;
    # Path specific CSP headers
    add_header  Report-To   "<other-specific-config>" always;
    add_header  Content-Security-Policy "<other-specific-config>" always;
    # Redirect everything to /
    rewrite .* / last;
}

我意识到任何location带有 的add_header都意味着任何顶级(在本例中在server模板中add_header不会被继承

上面的问题是它根本不起作用!location特定的标题并不总是被使用。我认为这就是rewrite问题所在,但我也尝试过try_files(匹配模板)但没有成功。我也试过除了location块中的额外标题之外什么都没有,但没有成功。我也认为我所做的也不是最好的方法......

请注意,我简化了添加的标头,例如包括 CSP 标头,还有其他全局标头和其他特定于位置的标头。我还有其他需要不同标头的路径,但我认为我上面得到的东西可以用我可以应用于它们的通用解决方案来修复。

答案1

rewrite...last将导致 Nginx搜索新位置处理请求。只有最后一个location才能设置响应标头。

location您可以在设置响应标头的同一个块中处理整个请求,rewrite...break或者更简单地使用try_files如下:

try_files /index.html =404;

请注意,该/index.html术语是不是最后一个参数。如果这是最后一个参数,它将导致 Nginx 搜索新的位置来处理请求。


或者,将所有add_header语句放在一起,并使用map设置特定值。请参阅这个答案

相关内容