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


12

我试图在不触摸任何代码的情况下实现跨域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

当请求方法为OPTIONS时,如何配置Apache响应“ 200 OK”?

我已经尝试过此mod_rewrite块,但是访问控制标头丢失了。

RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L]       

Answers:


12

您正在向不成功(非2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与always对应的表。

正确的“标题集”:

Header always set Access-Control-Allow-Origin "*"                   
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"

7

如果您设置了用于身份验证访问的目录,则Chrome和Safari等浏览器(可能还有其他浏览器)总是会在XmlHttpRequest调用之前发送未经身份验证的OPTIONS请求,该请求始终为401,并且如果我们不设置.htaccess文件/ apache配置,则会失败允许OPTIONS方法而无需身份验证。那让我发狂了两天,这就是网站管理员保守秘密的那种“神秘”信息!无论如何,我这样配置了.htaccess,现在它可以工作了:

AuthUserFile <path to password file>
AuthName "Thou shalt not pass!"
AuthType Basic
Options -Indexes
<LimitExcept OPTIONS>
  Require valid-user
</LimitExcept>

然后,您必须在PHP脚本上正确设置标头。


1
最后一行很重要。如果基础Web服务无法处理OPTIONS请求,您将收到404错误。
user2297366

7

有时,这种方法可以帮助您:

<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的服务器时,它很有用


它解锁了我的请求。出奇。在Apache 2.4上,在blank.html上使用此规则不存在!
Nadir
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.