实战讲解Nginx中add_header的always参数在跨域中的重要性

星明同学_9433

星明同学_9433

2026-04-05

869人浏览

原创

必须添加 always 参数,否则 Nginx 仅在 2xx/3xx 响应中输出 CORS 头,导致 4xx/5xx 和 OPTIONS 预检失败时缺失头信息,引发浏览器跨域拦截。

实战讲解nginx中add_header的always参数在跨域中的重要性

在 Nginx 中配置跨域(CORS)时,很多人会写 add_header Access-Control-Allow-Origin "*";,却发现浏览器仍然报错:“The 'Access-Control-Allow-Origin' header contains multiple values”。问题往往就出在没加 always 参数——它决定了响应头是否在所有 HTTP 状态码下都生效,而跨域预检失败、404、500 等非 2xx 响应恰恰最容易被忽略。

为什么跨域请求常在非200响应中失败?

浏览器发起跨域请求前,会先发一个 OPTIONS 预检请求;若后端返回 401、404 或 500,Nginx 默认不会将 add_header 指令添加到这些响应中(除非显式声明 always)。此时响应里缺失 Access-Control-Allow-Origin 等关键头,浏览器直接拒绝后续实际请求,控制台报 CORS 错误。

  • OPTIONS 预检返回 404 → 缺少 CORS 头 → 浏览器终止请求
  • 真实请求返回 500 → Nginx 不注入 CORS 头 → 控制台显示 “No 'Access-Control-Allow-Origin' header”
  • 静态资源返回 403(如未授权访问 /api)→ 同样不带 CORS 头 → 跨域拦截

always 参数到底改变了什么?

add_header ... always; 的作用是:让该响应头在所有响应状态码(包括 200、201、302、400、404、500 等)中都强制输出。默认情况下,add_header 只对 2xx 和 3xx 响应生效。

  • ❌ 默认写法:add_header Access-Control-Allow-Origin "*"; → 仅 2xx/3xx 响应携带
  • ✅ 正确写法:add_header Access-Control-Allow-Origin "*" always; → 所有响应都携带
  • ⚠️ 注意:多个 add_header 指令叠加时,always 必须每个都加,不能继承

完整跨域配置示例(含 always)

以下是最小可用且健壮的 Nginx 跨域配置,覆盖预检、正常请求及错误响应:

location /api/ {
    # 允许任意源(生产环境请替换为具体域名)
    add_header Access-Control-Allow-Origin "*" always;
    add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" always;
    add_header Access-Control-Allow-Headers "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" always;
    add_header Access-Control-Expose-Headers "Content-Length,Content-Range" always;
    add_header Access-Control-Allow-Credentials "true" always;
<pre class="brush:php;toolbar:false;"># 处理预检请求
if ($request_method = OPTIONS) {
    add_header Access-Control-Max-Age 1728000;
    add_header Content-Type "text/plain; charset=utf-8";
    add_header Content-Length 0;
    return 204;
}

}

注意:上面所有 add_header 行末尾都带 always,确保 4xx/5xx 错误响应也具备跨域许可能力,避免前端“看不见的拦截”。

容易踩坑的几个细节

光加 always 还不够,还需配合其他实践:

  • 不要在 server 块顶层写 add_header,应在具体 location 中定义,避免继承污染
  • Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials: true 不能同时设为 "*",否则浏览器拒绝;需动态设置 Origin 值(用 $http_origin)
  • 使用 if 判断 $request_method = OPTIONS 是常见做法,但需确保其内部也用了 always(如上例)
  • 重启 Nginx 后务必用 curl -I -X OPTIONS http://yourdomain/api/test 验证响应头是否真实存在

不复杂但容易忽略 —— always 就像给 CORS 头加了个“全状态保险”,让跨域逻辑真正贯穿整个请求生命周期,而不是只在“一切顺利”时才起作用。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

423

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

4107

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6965

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

601

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1516

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3998

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

557

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

179

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习