为什么 nginx add_headers 不能正常工作?
Why nginx add_headers doesn't work properly?
我正在使用 Nginx 作为 Web 服务器。
这是我的 nginx.conf
文件:
server {
listen 80;
root /usr/share/nginx/html;
index index.html index.htm;
location ^~ /start/ {
add_header 'Cross-Origin-Embedder-Policy' 'require-corp';
add_header 'Cross-Origin-Opener-Policy' 'same-origin';
try_files $uri $uri/ /index.html;
}
location / {
try_files $uri $uri/ /index.html;
}
}
当我在浏览器上打开此 link 时,我在响应 headers 部分的网络选项卡中看不到 header:
https://example.com/start/629852d359d2a400034698a2
实际上 add_header
指令工作正常。很可能 headers 没有被添加,因为你的服务器上没有 /usr/share/nginx/html/start/629852d359d2a400034698a2
文件或目录,所以根据最后一个 try_files
指令参数,请求被重写为 /index.html
,反过来由您的 location / { ... }
处理(因为新 URI 不以 /start/
前缀开头),并且该位置不会设置任何额外的 headers.
通常,如果那些 /start/
前缀的 URI 可以是内部应用程序路由或外部资产链接,则可以使用 map
块来评估所需的 header 来解决这个问题s 值:
map $uri $add_policies {
~^/start/ 1;
# default value will be an empty string, unless specified explicitly
}
map $add_policies $embedder_policy {
1 require-corp;
}
map $add_policies $opener_policy {
1 same-origin;
}
server {
...
location / {
add_header Cross-Origin-Embedder-Policy $embedder_policy;
add_header Cross-Origin-Opener-Policy $origin_policy;
try_files $uri $uri/ /index.html;
}
}
此解决方案基于 add_header
行为,如果提供的值为空字符串,则根本不会将指定的 header 添加到响应中。
但是,如果您确定应该添加这些 header 的 URI 是应用程序路由而不是指向实际存在的文件的链接,那么您还有一个选择:
server {
...
location ^~ /start/ {
set $embedder_policy require-corp;
set $origin_policy same-origin;
rewrite ^ /index.html last;
}
location / {
add_header Cross-Origin-Embedder-Policy $embedder_policy;
add_header Cross-Origin-Opener-Policy $origin_policy;
try_files $uri $uri/ /index.html;
}
}
此解决方案的性能应该更高一些,因为它不需要(某种昂贵的)PCRE 库调用来执行正则表达式匹配操作。
我正在使用 Nginx 作为 Web 服务器。
这是我的 nginx.conf
文件:
server {
listen 80;
root /usr/share/nginx/html;
index index.html index.htm;
location ^~ /start/ {
add_header 'Cross-Origin-Embedder-Policy' 'require-corp';
add_header 'Cross-Origin-Opener-Policy' 'same-origin';
try_files $uri $uri/ /index.html;
}
location / {
try_files $uri $uri/ /index.html;
}
}
当我在浏览器上打开此 link 时,我在响应 headers 部分的网络选项卡中看不到 header:
https://example.com/start/629852d359d2a400034698a2
实际上 add_header
指令工作正常。很可能 headers 没有被添加,因为你的服务器上没有 /usr/share/nginx/html/start/629852d359d2a400034698a2
文件或目录,所以根据最后一个 try_files
指令参数,请求被重写为 /index.html
,反过来由您的 location / { ... }
处理(因为新 URI 不以 /start/
前缀开头),并且该位置不会设置任何额外的 headers.
通常,如果那些 /start/
前缀的 URI 可以是内部应用程序路由或外部资产链接,则可以使用 map
块来评估所需的 header 来解决这个问题s 值:
map $uri $add_policies {
~^/start/ 1;
# default value will be an empty string, unless specified explicitly
}
map $add_policies $embedder_policy {
1 require-corp;
}
map $add_policies $opener_policy {
1 same-origin;
}
server {
...
location / {
add_header Cross-Origin-Embedder-Policy $embedder_policy;
add_header Cross-Origin-Opener-Policy $origin_policy;
try_files $uri $uri/ /index.html;
}
}
此解决方案基于 add_header
行为,如果提供的值为空字符串,则根本不会将指定的 header 添加到响应中。
但是,如果您确定应该添加这些 header 的 URI 是应用程序路由而不是指向实际存在的文件的链接,那么您还有一个选择:
server {
...
location ^~ /start/ {
set $embedder_policy require-corp;
set $origin_policy same-origin;
rewrite ^ /index.html last;
}
location / {
add_header Cross-Origin-Embedder-Policy $embedder_policy;
add_header Cross-Origin-Opener-Policy $origin_policy;
try_files $uri $uri/ /index.html;
}
}
此解决方案的性能应该更高一些,因为它不需要(某种昂贵的)PCRE 库调用来执行正则表达式匹配操作。