核心是用RewriteRule截断OPTIONS请求返回204状态码,并用Header always set精准注入CORS头;必须启用mod_headers和mod_rewrite模块,配合确保头仅作用于预检响应。

在 httpd.conf 中配置 Apache 处理 OPTIONS 预检请求,核心是两件事:一是用 RewriteRule 截断 OPTIONS 请求、直接返回 204 状态码;二是用 Header always set 在该响应中精准注入 CORS 头。不能只加头不拦截,也不能只拦截不加头——否则浏览器收不到合法预检响应,缓存也失效。
确保 mod_headers 和 mod_rewrite 已启用
这两模块缺一不可:
-
mod_headers提供Header指令,用于设置响应头 -
mod_rewrite提供RewriteCond和RewriteRule,用于识别并终止 OPTIONS 请求
检查是否已启用(CentOS/RHEL 常用):
grep -E '^(LoadModule|Include)' /etc/httpd/conf/httpd.conf | grep -E '(headers|rewrite)'
若未启用,执行:
a2enmod headers rewrite # Debian/Ubuntu
syntax: sudo a2enmod headers rewrite
systemctl restart httpd # 或 apache2
在 httpd.conf 中添加预检专用配置块
把以下内容插入 httpd.conf 的全局作用域(如在 <ifmodule></ifmodule> 外或 <virtualhost></virtualhost> 内),**不要放在 <directory></directory> 或 .htaccess 里**,否则部分场景无法生效:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
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-Max-Age "86400"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ - [R=204,L]
注意点:
-
Header always set必须配合<limit options></limit>,否则 204 响应里不会带这些头 -
RewriteRule ^(.*)$ - [R=204,L]中的-表示不改 URL,R=204是标准写法,不能写成R=200或Redirect 204 - Origin 值建议用具体域名,避免用
*(尤其开启Access-Control-Allow-Credentials时会冲突)
避免后端重复处理 OPTIONS 请求
Apache 已响应预检,后端再接一次 OPTIONS 容易导致头重复、状态码错乱或鉴权异常:
- PHP-FPM 或 CGI 场景:确认
php.ini或应用层没额外输出 CORS 头 - Node.js(Express):确保
cors()中preflightContinue: false(默认值,但需确认未覆盖) - Python(Django/Flask):禁用中间件对 OPTIONS 的响应逻辑,或统一交由 Apache 处理
验证是否生效:
curl -I -X OPTIONS https://yoursite.com/api/test
应返回 HTTP/1.1 204 No Content,且响应头中只含你配置的 Access-Control-* 字段,无重复或缺失。

















