返回
创建于
状态公开
在 Nginx 中,always 是 add_header 指令的一个可选参数,它的作用是确保指定的 Header 在任何 HTTP 响应中都会被添加,而不仅仅局限于成功的响应状态码(200、201、204 等)。下面详细解释 always 的作用和使用场景:
默认行为(无 always)
在没有 always 参数时,add_header 只会在以下条件满足时生效:
- 响应的 HTTP 状态码是成功的(通常是 200、201、204、206、301、302、303、307 等)。
- 如果响应是错误状态码(例如 400、403、404、500 等),
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: 9X-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 依然会被添加。
使用场景
-
调试和日志记录:
- 在所有响应中添加自定义 Header(如请求 ID 或版本号),方便追踪问题,即使是错误响应。
-
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,确保客户端正确处理缓存,即使是错误页面。
- 在所有响应中强制设置
-
一致性需求:
- 如果你希望某些 Header(如安全相关的
X-Frame-Options或X-Content-Type-Options)在任何情况下都出现,always非常有用。
- 如果你希望某些 Header(如安全相关的
注意事项
-
性能影响:
- 添加
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 在所有响应中都生效。 - 用途:确保 Header 的强制性和一致性,尤其在错误响应或特殊场景中。
如果还有疑问,可以告诉我你的具体需求或配置,我再帮你细化!