大体配置是这样,想实现带 mycookie 这个 cookie 的 php 页面,添加 Cache-Control 这个 http 头:
server {
...
set $skip_cache 0;
if ($http_cookie ~* "mycookie") {
set $skip_cache 1;
}
location ~ [^/]\.php(/|$) {
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
if ($skip_cache = 1) {
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
}
}
}
发现加了下面这 3 行代码后, Cache-Control 头倒是出现了,但是 X-Frame-Options 和 X-Content-Type-Options 这两个 http 头不见了,删掉这 3 行代码后又出现:
if ($skip_cache = 1) {
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0";
}
1
julyclyde 2017-04-25 22:15:37 +08:00
有一些指令的特性是这样的,只能在同一层内生效
所以你大概可以明白 fastcgi.conf 和 fastcgi_params 文件的用途了吧 |
2
rrfeng 2017-04-25 22:17:21 +08:00
if-is-evil
|
3
peesefoo OP @rrfeng 测试了一下,如果不用 if ,仅仅添加:
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0"; X-Frame-Options 和 X-Content-Type-Options 这两个头也会消失。 |
4
crystom 2017-04-25 22:24:53 +08:00
add_header 是数组,子块里有就会覆盖所有
|
5
rrfeng 2017-04-25 22:27:15 +08:00
location ~ [^/]\.php(/|$) {
add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0"; } 这样也会只有最后一个? |
7
Mitt 2017-04-25 22:40:16 +08:00
尝试加 always 参数
``` add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; ``` PS: 网上查的解决方案。 Nginx > 1.7.5 |
8
msg7086 2017-04-25 23:51:56 +08:00
nginx 里使用 if 判断,出问题不稀奇。
|
9
isCyan 2017-04-26 00:12:11 +08:00 via Android
crystom 的回答应该是正解
|
10
ryd994 2017-04-26 00:30:43 +08:00 via Android
if is evil
|
11
spacewander 2017-04-26 22:43:40 +08:00 via Android
这事还真不好怪在 if 头上。
add_header 定义在下一级的会覆盖上一级的。你可以试试在 server 级别定义 add_header 看看。 一般遇到纠结于 Nginx 配置的人,我都会安利 lua-nginx-module 。可以省下不少 corner case 的精力。 |