我正在尝试实现跨域HTTP 访问控制无需触及任何代码。
我的 Apache(2) 服务器通过以下块返回了正确的访问控制标头:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS"
HTTP OPTIONS
现在我需要在浏览器发送请求(它存储在REQUEST_METHOD
环境变量中)时阻止 Apache 执行我的代码,并返回200 OK
。
如何配置 Apache 使其在请求方法为 OPTIONS 时响应“200 OK”?
我已经尝试过这个mod_rewrite
块,但是访问控制标头丢失了。
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
答案1
您正在向非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与始终对应的表。
正确的“标题集”:
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
答案2
如果您设置了用于经过身份验证的访问的目录,Chrome 和 Safari 等浏览器(可能还有其他浏览器)总是在 XmlHttpRequest 调用之前发送未经认证的 OPTIONS 请求,如果我们不设置 .htaccess 文件/apache 配置以允许 OPTIONS 方法而无需身份验证,该请求总是会得到 401 并失败。这让我抓狂了两天,我想这就是网站管理员保密的那种“深奥”信息吧!无论如何,我像这样配置了我的 .htaccess,现在它可以正常工作了:
AuthUserFile <path to password file>
AuthName "Thou shalt not pass!"
AuthType Basic
Options -Indexes
<LimitExcept OPTIONS>
Require valid-user
</LimitExcept>
然后您必须在 PHP 脚本上正确设置标题。
答案3
有时这种方法可以有所帮助:
<IfModule mod_headers.c>
Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ blank.html [QSA,L]
当你有类似 apache 的服务器时它很有用