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

Mar*_*ald 17 security mod-rewrite http apache-2.2

我正在尝试在不涉及任何代码的情况下实现跨域HTTP 访问控制

我的 Apache(2) 服务器使用此块返回正确的访问控制标头:

Header set Access-Control-Allow-Origin "*"                   
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS" 
Run Code Online (Sandbox Code Playgroud)

我现在需要阻止 Apache 在浏览器发送HTTP OPTIONS请求(它存储在REQUEST_METHOD环境变量中)时执行我的代码,返回200 OK.

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

我试过这个mod_rewrite块,但访问控制头丢失了。

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

alv*_*osu 13

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

正确的“标题集”:

Header always set Access-Control-Allow-Origin "*"                   
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
Run Code Online (Sandbox Code Playgroud)


小智 9

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

AuthUserFile <path to password file>
AuthName "Thou shalt not pass!"
AuthType Basic
Options -Indexes
<LimitExcept OPTIONS>
  Require valid-user
</LimitExcept>
Run Code Online (Sandbox Code Playgroud)

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


小智 8

有时这种方法可以帮助:

<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]
Run Code Online (Sandbox Code Playgroud)

当你有类似 apache 的服务器时它很有用