代码之家  ›  专栏  ›  技术社区  ›  Paddy Hallihan

CORS和XMLHTTP-对飞行前请求的响应未通过访问控制检查:它没有HTTP ok状态

  •  0
  • Paddy Hallihan  · 技术社区  · 4 年前

    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 virtualhost配置如下所示:

        <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处理?

    0 回复  |  直到 3 年前
        1
  •  24
  •   sideshowbarker Miguel Tomás    4 年前

    要完全启用CORS,需要将Apache web服务器配置为如下所示:

    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Headers "Authorization"
    Header always set Access-Control-Allow-Methods "GET"
    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 header names 或所谓 “forbidden” header names (浏览器设置的不能在JavaScript中设置的标题名称); the spec alternatively allows the * wildcard 因为它的价值,所以您可以在某一天尝试,但目前还没有浏览器支持它: Chrome bug , Firefox bug , Safari bug

    • Access-Control-Allow-Methods : 通配符 但再一次,就像 Access-Control-Allow-Headers: *

    • Access-Control-Expose-Headers :必须设置为包含客户端代码需要读取的任何响应标题 Cache-Control Content-Language , Content-Type , Expires , Last-Modified Pragma 默认情况下是公开的(很多人忘记了设置,最终对他们为什么不能读取特定响应头的值感到困惑);再一次 规范也允许 通配符 这里,但还没有浏览器支持它

    • Access-Control-Max-Age :铬的上限为 600 (10分钟) hardcoded 因此,没有必要为它设置一个更高的值(Firefox可能会尊重它,但如果你将它设置得更高,Chrome只会将它限制在10分钟内,Safari将它限制在10分钟内) 5. (分钟)


    因此,关于问题中显示的特定请求,需要进行的具体更改和补充如下:

    • 使用 Header always set 而不仅仅是 Header set

    • mod_rewrite OPTIONS 只要寄回一封信 200 OK

    • 请求已被取消 Access-Control-Request-Headers:authorization 因此,在Apache配置中,添加 Authorization 访问控制允许标头 响应标题也是。

    • Origin 是由浏览器设置的禁止标题名称,并且 Accept 访问控制允许标头

    • 请求不发送任何消息 ,因此在中不需要它 访问控制允许标头 在响应中(并且不需要 GET 请求,否则仅当类型不是 application/x-www-form-urlencoded , text/plain multipart/form-data

    • 对于 访问控制允许方法 得到 ,所以除非计划也制定 POST / PUT / DELETE PATCH 请求,没有必要显式地包含它们