OpenServer下Apache配置Access-Control-Allow-Origin不生效问题咨询
排查步骤
确认mod_headers模块已启用
Apache的Header指令依赖mod_headers模块,你可以先检查OpenServer的Apache配置中是否加载了该模块:找到Apache根目录下的httpd.conf,确认LoadModule headers_module modules/mod_headers.so行没有被#注释,若被注释则取消注释后重启Apache。检查配置放置位置
Header set Access-Control-Allow-Origin "*"的配置不要放在全局配置的非目标区域,优先放到对应站点的<VirtualHost>块内部,或者站点对应目录的<Directory>块中。如果站点根目录存在.htaccess文件,也要检查该文件中是否有其他跨域头配置,.htaccess的优先级高于服务端主配置,会覆盖你在server.conf中的设置。排查重复配置冲突
如果你在全局配置、虚拟主机配置、.htaccess中多处配置了Access-Control-Allow-Origin,会导致头重复或者冲突失效。可以通过curl -I 你的接口请求地址命令查看响应头,确认是否存在多个跨域头或者无跨域头的情况。补充预检请求配置
如果你的请求属于带自定义头、非GET/POST的复杂请求,浏览器会先发送OPTIONS预检请求,仅配置基础跨域头不会生效,需要补充完整配置:
<IfModule mod_headers.c> # 所有响应都携带跨域头,使用always参数适配异常响应码场景 Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" Header always set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With" Header always set Access-Control-Max-Age 86400 # 预检请求直接返回200,不需要走业务逻辑 <Limit OPTIONS> Require all granted </Limit> </IfModule>
- 替换
Header set为Header always set
默认Header set仅会在200系列响应码的返回中加头,如果你的接口返回4xx、5xx类错误,跨域头不会被携带,浏览器依然会报跨域错误,加上always参数可以适配所有响应码场景。
内容的提问来源于stack exchange,提问作者Kifsif
相关产品推荐
相关产品推荐

