我想为不同的位置提供不同的标头,但回退到始终提供特定文件(如果找不到匹配的文件)。
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
设置特定值。请参阅这个答案。