在 Apache 中对 HTTP OPTIONS 请求返回“200 OK”

在 Apache 中对 HTTP OPTIONS 请求返回“200 OK”

我正在尝试实现跨域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 的服务器时它很有用

相关内容