飞行前请求不由apache处理(CORS)

Kar*_*son 5 apache ip http cors preflight

一般:

Request URL:x/site.php
Request Method:OPTIONS
Status Code:302 Found
Remote Address:x.x.x.x:80
Run Code Online (Sandbox Code Playgroud)

响应标题:

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

请求标题:

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

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

预检请求正在跳过apache配置并直接点击我的webapp,这会进行重定向(因此302和位置:y).

我不知道为什么apf没有处理预检请求?

sid*_*ker 11

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

  • 使用Header always set而不仅仅是Header set
  • 使用mod_rewrite处理OPTIONS,只需发回200 OK带有这些标题的a

因此,要使问题中的请求生效,这里是一个最小(ish)配置代码段:

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

更长的解释,访问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安全标头名称或所谓的"禁止"标头名称(由您无法在JavaScript中设置的浏览器设置的标头名称); 规范或者允许*通配符作为其值 - 所以你可以在某一天尝试它,但是没有浏览器支持它: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-ModifiedPragma哪位默认曝光(很多人都忘了设置这个并最终困惑,为什么他们不能读的价值一个特定的响应头); 再次规范或者允许*这里使用通配符,但是没有浏览器支持它

  • Access-Control-Max-Age:Chrome的硬编码上限为600(10分钟),因此为它设置一个更高的值没有意义(Firefox可能会尊重它,但如果你将它设置得更高,Chrome只会将它降低到10分钟,并且Safari将其限制为仅5分钟)

那么,关于问题中显示的特定请求,这里有一些特定的注释:

  • 您的请求Access-Control-Request-Headers:authorization在您的Apache配置中也有,请AuthorizationAccess-Control-Allow-Headers响应标头中添加.

  • Origin是浏览器设置的"禁止"标题名称,Accept是一个CORS安全标题名称,因此您不需要将它们包括在内Access-Control-Allow-Headers

  • 您的要求不发送Content-Type,所以它不需要在Access-Control-Allow-Headers在响应(永不需要GET请求,否则只需要如果类型是比其他application/x-www-form-urlencoded,text/plainmultipart/form-data)

  • 因为Access-Control-Allow-Methods,你的请求似乎只是一个GET,所以除非你打算也提出POST/ PUT/ DELETE/ PATCH请求,否则明确包含它们没有意义


归档时间:

查看次数:

6180 次

最近记录:

6 年,3 月 前