我无法调试这部分 nginx 配置:
我想为.pdf
文件的所有请求添加一些标头
,然后我想删除添加到我的 veiw 目录中的令牌,以避免不必要的浏览器缓存:
location /static {
location ~* \.pdf$ {
add_header Access-Control-Allow-Origin *;
add_header Content-Disposition 'inline';
}
#Remove Anti cache token
rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
...
}
没有 nginx 语法错误,但请求.pdf
显示 404 未找到错误,这意味着重写不适用于该请求。
非常感谢您的帮助,
谢谢
答案1
当nginx
选择一个location
来处理请求时,它可能选择内部或外部location
块。它不会将两者的语句组合起来。
嵌套的rewrite
不会继承location
。如果您希望rewrite
应用于所有位置,则应将其置于server
块作用域中。
您的语句的正则表达式rewrite
足够具体,可以按原样移动。
例如:
rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
location /static {
location ~* \.pdf$ {
add_header Access-Control-Allow-Origin *;
add_header Content-Disposition 'inline';
}
...
}
当然,在两个块中重复该rewrite
语句可能会更有效location
。
另一种方法是完全避免rewrite
使用正则表达式,location
通过使用指令来删除反缓存令牌alias
。请参阅这个文件了解更多信息。
例如:
location ~ "^(?<prefix>/static)[0-9]{10}(?<suffix>/.*)$" {
alias /path/to/root$prefix$suffix;
location ~* \.pdf$ {
add_header Access-Control-Allow-Origin *;
add_header Content-Disposition 'inline';
}
...
}
请注意,正则表达式location
块与前缀块的评估顺序不同location
。请参阅这个文件了解详情。
答案2
虽然这个问题的最佳答案是我检查过的最佳答案,但我想发布我解决问题的解决方案。没有必要定义嵌套位置块来向某些请求添加标头。相反,我使用 if 来检查正则表达式条件并执行我想要的操作。
查看我为处理此问题而编写的以下块:
location /static {
if ( $request_uri ~* \.pdf$ ) {
add_header Access-Control-Allow-Origin *;
add_header Content-Disposition 'inline';
}
#Remove Anti cache token
rewrite "^/static[0-9]{10}/(.*)$" /static/$1 last;
...
}