apache中配置cors需三步:启用mod_headers模块、在virtualhost或directory中用header always set添加响应头(生产环境禁用且credentials与不可共存)、用rewrite规则拦截options预检请求返回200。

Apache 中静态网站部署本身不处理 API 请求,但若你用它托管前端页面(如 Vue/React 打包产物),同时又通过它反向代理后端接口(比如 ProxyPass 到 localhost:3001),那么跨域问题就发生在“前端页面请求代理路径”这个环节。此时 CORS 配置必须由 Apache 统一控制,而不是靠后端代码加 header——因为静态资源没后端逻辑,而代理流量可被 Apache 拦截并注入响应头。
确认并启用 mod_headers 模块
这是添加响应头的前提,缺省可能未开启:
- 运行
sudo a2enmod headers启用模块 - 执行
sudo systemctl restart apache2(Ubuntu/Debian)或sudo apachectl restart(macOS/CentOS)重载服务 - 验证是否生效:
apache2ctl -M | grep headers应输出headers_module (shared)
在虚拟主机或目录配置中设置标准 CORS 头
不要写在 .htaccess(性能差且易被忽略),推荐直接改站点的 <virtualhost></virtualhost> 或 <directory></directory> 块。例如:
<directory>
Header always set Access-Control-Allow-Origin "https://your-frontend.com"
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-Allow-Credentials "true"
Header always set Access-Control-Max-Age "86400"
</directory>
注意:生产环境严禁用 * 替代域名;启用了 Access-Control-Allow-Credentials: true 就必须指定具体源,否则浏览器会拒绝响应。
Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
拦截并正确响应 OPTIONS 预检请求
前端发 POST/PUT 等非简单请求前,浏览器会先发 OPTIONS。Apache 必须自己处理,不能转发给后端(尤其用了 ProxyPass 时):
- 在
<virtualhost></virtualhost>内、ProxyPass指令之前加入:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
配合前面的 Header always set,就能让预检返回带 CORS 头的 200,后续真实请求才得以发出。
若只托管纯静态页、API 完全由其他服务提供
这时 Apache 不接触 API 响应,CORS 必须由真正提供接口的服务配置(如 Nginx 反代 Node.js、或后端框架内置中间件)。Apache 层只能做一件事:确保它不主动移除已有的 CORS 头。检查是否有类似 Header unset Access-Control-Allow-Origin 的误配,并删除。










