.htaccess配置跨域头仍报No Access-Control-Allow-Origin缺失错误
问题根因
你的CORS配置存在头字段名写错的低级错误,三条Header规则全部重复设置Access-Control-Allow-Origin字段,后两条规则直接覆盖了第一条的通配符设置,最终响应里既没有正确的允许源声明,也缺失了允许方法、允许请求头的必备字段,必然触发CORS拦截。
具体错误点如下:
- 允许请求方法的头字段名是
Access-Control-Allow-Methods,你错写成了Access-Control-Allow-Origin - 允许自定义请求头的头字段名是
Access-Control-Allow-Headers,你错写成了Access-Control-Allow-Origin - 没有处理OPTIONS预检请求:跨域非简单请求会先发送OPTIONS方法的预检请求,你的现有规则会把这类请求丢给PHP路由处理,大概率不会返回正确的CORS头
- 所有Header规则没有加
always参数,301/302跳转、4xx/5xx响应阶段不会带上你设置的CORS头,预检请求如果触发HTTPS/WWW跳转就会直接失败
修复后的完整.htaccess配置
# 需提前确认Apache已启用mod_headers模块,否则Header指令不生效 Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "PUT, POST, DELETE, GET, OPTIONS" Header always set Access-Control-Allow-Headers "Accept, Authorization, Content-Type" RewriteEngine On # 优先处理OPTIONS预检请求,直接返回200不进入后续跳转、重写逻辑 RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] Options All -Indexes # WWW跳转 RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # HTTPS跳转 RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 路由重写 RewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-d RewriteRule ^(.*)$ index.php?route=/$1 [L,QSA]
额外注意事项
- 如果你的跨域请求需要携带Cookie、HTTP认证凭证,不能用
*作为允许源,必须把Access-Control-Allow-Origin的值替换为具体的前端站点域名(比如https://your-frontend.com),同时新增一行配置Header always set Access-Control-Allow-Credentials "true" - 修改配置后务必清除浏览器缓存再测试,301重定向、CORS相关响应头都会被浏览器强缓存,旧缓存会干扰测试结果
- 如果配置后依然没有返回对应CORS头,先检查Apache是否启用了
mod_headers模块,模块未启用时所有Header指令都不会生效
内容的提问来源于stack exchange,提问作者Jonathan Martins
相关产品推荐
相关产品推荐

