加载笔记内容...
加载笔记内容...
在 Nginx 中,always
是 add_header
指令的一个可选参数,它的作用是确保指定的 Header 在任何 HTTP 响应中都会被添加,而不仅仅局限于成功的响应状态码(200、201、204 等)。下面详细解释 always
的作用和使用场景:
always
)在没有 always
参数时,add_header
只会在以下条件满足时生效:
add_header
定义的 Header 不会被添加到响应中。示例(无 always
):
1location / {
2 add_header X-Custom-Header "my-value";
3 return 200 "OK"; # 状态码 200,Header 生效
4}
响应:
1HTTP/1.1 200 OK
2X-Custom-Header: my-value
3Content-Length: 2
但如果改为:
1location / {
2 add_header X-Custom-Header "my-value";
3 return 404 "Not Found"; # 状态码 404,Header 不生效
4}
响应:
1HTTP/1.1 404 Not Found
2Content-Length: 9
X-Custom-Header
不会出现在响应中,因为 404 不是“成功”状态码。
always
的作用当你为 add_header
添加 always
参数时,Nginx 会无条件地将指定的 Header 添加到所有响应中,无论状态码是成功(200 系列)、重定向(300 系列)还是错误(400、500 系列)。
示例(有 always
):
1location / {
2 add_header X-Custom-Header "my-value" always;
3 return 404 "Not Found"; # 状态码 404,Header 仍然生效
4}
响应:
1HTTP/1.1 404 Not Found
2X-Custom-Header: my-value
3Content-Length: 9
即使是 404,X-Custom-Header
依然会被添加。
调试和日志记录:
CORS 配置:
Access-Control-Allow-Origin
等 Header 在所有响应中都存在(包括 403、405 等),以避免浏览器因缺少 Header 而报错。示例:
1location / {
2 add_header Access-Control-Allow-Origin "*" always;
3 return 403 "Forbidden";
4}
即使返回 403,CORS Header 依然生效。
缓存控制:
Cache-Control
,确保客户端正确处理缓存,即使是错误页面。一致性需求:
X-Frame-Options
或 X-Content-Type-Options
)在任何情况下都出现,always
非常有用。性能影响:
always
不会显著影响性能,但如果 Header 过多且不必要,可能会增加响应的大小。覆盖行为:
always
不改变 add_header
的追加逻辑。如果同一个 Header 在多个地方定义,后定义的会覆盖先定义的。示例:
1location / {
2 add_header X-Test "value1";
3 add_header X-Test "value2" always;
4 return 404 "Not Found";
5}
响应:
1HTTP/1.1 404 Not Found
2X-Test: value2
兼容性:
always
参数是在 Nginx 1.7.5 版本引入的。如果你的 Nginx 版本过旧(低于 1.7.5),需要升级才能使用。检查版本:
1nginx -v
在你之前的配置中,只有 Content-Type
生效,可能是因为响应状态码不是成功的,或者后续的 add_header
被某种机制忽略。加上 always
可以确保所有 Header 都无条件生效:
1location / {
2 add_header Content-Type "text/plain" always;
3 add_header Access-Control-Allow-Origin "*" always;
4 add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
5 add_header Access-Control-Allow-Headers "Content-Type" always;
6 add_header Cache-Control "max-age=31536000" always;
7 return 200 "Hello World";
8}
这样,无论响应状态码如何,所有 Header 都会被正确添加。
always
:Header 只在成功响应中生效。always
:Header 在所有响应中都生效。如果还有疑问,可以告诉我你的具体需求或配置,我再帮你细化!