预检请求不被阿帕奇处理(CORS)预检请求不被阿帕奇处理(CORS)(Preflight reque

2019-05-12 06:23发布

一般:

Request URL:x/site.php
Request Method:OPTIONS
Status Code:302 Found
Remote Address:x.x.x.x:80

响应头:

view source
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Origin:*
Access-Control-Max-Age:300
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length:0
Content-Type:text/html; charset=UTF-8
Date:Thu, 02 Mar 2017 14:27:21 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Location:y
Pragma:no-cache
Server:Apache/2.4.25 (Ubuntu)

请求报头:

view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:authorization
Access-Control-Request-Method:POST
Cache-Control:no-cache
Connection:keep-alive
DNT:1
Host:x
Origin:http://127.0.0.1:3000
Pragma:no-cache
Referer:http://127.0.0.1:3000/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36

Apache的虚拟主机的配置看起来像这样:

    <IfModule mod_headers.c>
           Header set Access-Control-Allow-Origin "http://127.0.0.1:3000"
           Header set Access-Control-Allow-Origin "http://127.0.0.1"
           Header set Access-Control-Max-Age "300"
           Header set Access-Control-Allow-Credentials "true"
           Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"
           Header set Access-Control-Allow-Methods "POST, GET, PUT, DELETE, PATCH, OPTIONS"
    </IfModule>

预检请求被跳过Apache的配置和击球直接我的web应用程序,它不重定向(因此302和位置:Y)。

我不知道为什么预检要求没有被阿帕奇处理?

Answer 1:

您需要更改/添加的两个主要的事情是:

  • 使用Header always set ,而不仅仅是Header set
  • 使用mod_rewrite的处理OPTIONS由刚刚发回200 OK与头

因此,为了能够在问题工作的要求,这里有一个最小的(ISH)配置片断:

Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Headers "Authorization"
Header always set Access-Control-Allow-Methods "GET, OPTIONS"
Header always set Access-Control-Expose-Headers "Content-Security-Policy, Location"
Header always set Access-Control-Max-Age "600"

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

在较长的解释https://benjaminhorn.io/code/setting-cors-cross-origin-resource-sharing-on-apache-with-correct-response-headers-allowing-everything-through/

什么值,为各种设置的一般常识Access-Control-响应头:

  • Access-Control-Allow-Headers :你必须将其设置为包含您的请求发送任何除外标题名称CORS-safelisted头名或所谓的“禁止入内”头名 (由你不能在设置浏览器设置头的名字你的JavaScript); 规范或者允许*通配符作为它的价值,以便您日后尝试,但没有浏览器支持它尚未: Chrome有错误 , Firefox的错误 , Safari浏览器的bug

  • Access-Control-Allow-Methods : 规范或者允许*通配符 -但是再次,与Access-Control-Allow-Headers: * ,没有浏览器都支持它尚未

  • Access-Control-Expose-Headers :你必须设置包含任何响应头你的客户端代码需要读取超出Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma哪位默认曝光(一很多人都忘了设置这一点,并结束了困惑,为什么他们不能读一个特定的响应头)的值; 再次规范或者允许*通配符在这里,但没有浏览器都支持它尚未

  • Access-Control-Max-Age :铬有上限600 (10分钟) 硬编码的 ,所以没有点它比设置一个较高的值(Firefox可能尊重它,但Chrome将只是阻止它下降到10分钟如果设置得更高,和Safari它限制到仅5分钟)

那么,关于这个问题所示的特定要求,这里有一些具体的注意事项:

  • 你的要求有Access-Control-Request-Headers:authorization因此在你的Apache配置,添加AuthorizationAccess-Control-Allow-Headers响应头了。

  • Origin是“禁止入内”头名由浏览器设置,并Accept是CORS-safelisted头名,所以你不需要将其列入Access-Control-Allow-Headers

  • 您的要求不发送Content-Type ,所以它不需要Access-Control-Allow-Headers的响应(和从来不需要为GET请求,否则只有当需要的类型比其他application/x-www-form-urlencodedtext/plain ,或者multipart/form-data

  • 对于Access-Control-Allow-Methods ,您的要求似乎只是一个GET ,所以除非你打算也使POST / PUT / DELETE / PATCH中明确包括他们的请求,没点



文章来源: Preflight request not being handled by apache (CORS)