Apache配置CORS的核心是启用mod_headers模块,在VirtualHost中用Header always set设置Access-Control-Allow-Origin等响应头,并通过mod_rewrite显式处理OPTIONS预检请求,生产环境须指定具体域名且禁用通配符*。

在 Linux 系统中配置 Apache 解决跨域资源共享(CORS)问题,核心是让服务器响应中包含正确的 Access-Control-Allow-Origin 等 HTTP 头。关键不在于“绕过”浏览器限制,而是让服务端主动声明允许哪些源访问资源。
确认并启用 mod_headers 模块
Apache 默认可能未启用 mod_headers,而它是设置自定义响应头的必要模块:
- 检查是否已启用:
a2enmod headers(Debian/Ubuntu)或运行httpd -M | grep headers(CentOS/RHEL) - 若未启用,执行:
sudo a2enmod headers或sudo systemctl restart httpd(CentOS) - 确保配置文件中没有禁用该模块(如
LoadModule headers_module modules/mod_headers.so已取消注释)
选择配置位置:虚拟主机 vs .htaccess
推荐优先使用虚拟主机配置(更安全、性能更好),仅在无权限修改主配置时用 .htaccess:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
-
虚拟主机方式(生产环境首选):编辑站点配置文件,如
/etc/apache2/sites-available/your-site.conf或/etc/httpd/conf.d/your-site.conf,在<VirtualHost>块内添加:
<IfModule mod_headers.c><br> Header always set Access-Control-Allow-Origin "https://your-frontend.com"<br> Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"<br> Header always set Access-Control-Allow-Headers "Content-Type, Authorization, X-Requested-With"<br> Header always set Access-Control-Allow-Credentials "true"<br></IfModule>
-
.htaccess 方式(共享主机适用):在网站根目录创建或编辑
.htaccess,内容同上,但需确保AllowOverride All在主配置中启用 - 注意:
Header always set比Header set更可靠,它确保所有响应状态码(包括 404、500)都携带 CORS 头
正确处理 OPTIONS 预检请求
浏览器对非简单请求(如带自定义头、PUT/DELETE 方法)会先发 OPTIONS 请求。Apache 需明确响应,否则请求卡住:
- 在虚拟主机或
.htaccess中添加:
<IfModule mod_rewrite.c><br> RewriteEngine On<br> RewriteCond %{REQUEST_METHOD} OPTIONS<br> RewriteRule ^(.*)$ $1 [R=204,L]<br></IfModule>
- 返回 204(No Content)比 200 更规范,避免空响应体引发兼容性问题
- 确保
mod_rewrite已启用:a2enmod rewrite
安全与生产注意事项
通配符 * 虽方便,但有严格限制:
- 若需支持
Access-Control-Allow-Credentials: true(如传 Cookie),Access-Control-Allow-Origin必须是具体域名,不能为* - 多域名支持可用
SetEnvIf+ 正则匹配,例如:SetEnvIf Origin "^(https?://(app\.example\.com|dashboard\.example\.com))$" CORS_ALLOW_ORIGIN=$1Header always set Access-Control-Allow-Origin "%{CORS_ALLOW_ORIGIN}e" env=CORS_ALLOW_ORIGIN - 重启服务使配置生效:
sudo systemctl restart apache2(Ubuntu)或sudo systemctl restart httpd(CentOS)

















