Ajax 调用不同域 URL 时出现 401 预检错误
401 Preflight error on Ajax call to different domain URL
我的请求显示在 Chrome 网络 XHR 工具上。
General:
Remote Address:127.0.0.1:80
Request URL:http://ws.uvx/app_dev.php/api/venuelogin
Request Method:OPTIONS
Status Code:400 Bad Request
Response Headers:
view source
Access-Control-Allow-Headers:x-custom-auth
Access-Control-Allow-Methods:POST, PUT, GET, DELETE, OPTIONS
Access-Control-Allow-Origin:http://localhost:8383
Access-Control-Max-Age:3600
Cache-Control:no-cache, max-age=604800
Connection:close
Content-Encoding:gzip
Content-Length:52
Content-Type:text/html; charset=UTF-8
Date:Wed, 23 Sep 2015 07:59:04 GMT
Expires:Wed, 30 Sep 2015 07:59:04 GMT
Server:Apache
Vary:Accept-Encoding
X-Debug-Token:8cd64c
X-Debug-Token-Link:/_profiler/8cd64c
X-Powered-By:PHP/5.5.10
Request Headers:
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:es-ES,es;q=0.8,en;q=0.6
Access-Control-Request-Headers:accept, content-type, p
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
Host:ws.uvx
Origin:http://localhost:8383
Pragma:no-cache
Referer:http://localhost:8383/UVox%20Mobile/jwt-demo/venuelogin.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36
我的 Ajax 电话:
jQuery.ajax({
url: "http://ws.uvx/app_dev.php/api/venuelogin",
type: "GET",
headers: {
"p": "1441",
"Content-type": "application/json"
}
})
以及 Symfony2 cors 配置:
nelmio_cors:
defaults:
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
expose_headers: []
max_age: 0
hosts: []
origin_regex: false
paths:
'^/api/':
allow_origin: ['*']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE','OPTIONS']
max_age: 3600
如果我将 allow_headers: ['X-Custom-Auth'] 更改为 allow_headers: ['*'] 那么我会收到 500 错误。
我也按照 PAW 的建议尝试使用 Content-Type:application/octet-stream,我在 OSX 应用程序中检查我的 API 请求。其实这个请求是来自PAW的200 OK
同时执行 CURL 我得到 JSON 200 OK。
我错过了什么?
非常感谢。
首先要检查的是您没有重写服务器上的 headers(site-enabled 配置)。所以看看它们并评论任何 Allow-Origin 行。
第二步是在您的应用程序上(在我的例子中是 Symfony):
a) 我的 FOSRESTBundle 配置在以下行的 json 之前包含 html:
format_listener:
rules:
- { path: ^/, priorities: [ json, xml, html ], fallback_format: json, prefer_extension: true }
所以我被迫在 url 前加上 .json,或者如下更新行,否则服务器试图 return a html,因为我没有为它创建模板,所以我得到了 500 错误。
b) 最后一步是避免在 routing.yml 处声明路由 'individually',并将其作为“手动”fosrestbundle 路由注释包含在用于休息类型路由的控制器上。
api_venues:
type: rest
resource: Acme\DemoBundle\Controller\Api\VenueController
我的请求显示在 Chrome 网络 XHR 工具上。
General:
Remote Address:127.0.0.1:80
Request URL:http://ws.uvx/app_dev.php/api/venuelogin
Request Method:OPTIONS
Status Code:400 Bad Request
Response Headers:
view source
Access-Control-Allow-Headers:x-custom-auth
Access-Control-Allow-Methods:POST, PUT, GET, DELETE, OPTIONS
Access-Control-Allow-Origin:http://localhost:8383
Access-Control-Max-Age:3600
Cache-Control:no-cache, max-age=604800
Connection:close
Content-Encoding:gzip
Content-Length:52
Content-Type:text/html; charset=UTF-8
Date:Wed, 23 Sep 2015 07:59:04 GMT
Expires:Wed, 30 Sep 2015 07:59:04 GMT
Server:Apache
Vary:Accept-Encoding
X-Debug-Token:8cd64c
X-Debug-Token-Link:/_profiler/8cd64c
X-Powered-By:PHP/5.5.10
Request Headers:
view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:es-ES,es;q=0.8,en;q=0.6
Access-Control-Request-Headers:accept, content-type, p
Access-Control-Request-Method:GET
Cache-Control:no-cache
Connection:keep-alive
Host:ws.uvx
Origin:http://localhost:8383
Pragma:no-cache
Referer:http://localhost:8383/UVox%20Mobile/jwt-demo/venuelogin.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36
我的 Ajax 电话:
jQuery.ajax({
url: "http://ws.uvx/app_dev.php/api/venuelogin",
type: "GET",
headers: {
"p": "1441",
"Content-type": "application/json"
}
})
以及 Symfony2 cors 配置:
nelmio_cors:
defaults:
allow_credentials: false
allow_origin: []
allow_headers: []
allow_methods: []
expose_headers: []
max_age: 0
hosts: []
origin_regex: false
paths:
'^/api/':
allow_origin: ['*']
allow_headers: ['X-Custom-Auth']
allow_methods: ['POST', 'PUT', 'GET', 'DELETE','OPTIONS']
max_age: 3600
如果我将 allow_headers: ['X-Custom-Auth'] 更改为 allow_headers: ['*'] 那么我会收到 500 错误。
我也按照 PAW 的建议尝试使用 Content-Type:application/octet-stream,我在 OSX 应用程序中检查我的 API 请求。其实这个请求是来自PAW的200 OK
同时执行 CURL 我得到 JSON 200 OK。
我错过了什么? 非常感谢。
首先要检查的是您没有重写服务器上的 headers(site-enabled 配置)。所以看看它们并评论任何 Allow-Origin 行。
第二步是在您的应用程序上(在我的例子中是 Symfony):
a) 我的 FOSRESTBundle 配置在以下行的 json 之前包含 html:
format_listener:
rules:
- { path: ^/, priorities: [ json, xml, html ], fallback_format: json, prefer_extension: true }
所以我被迫在 url 前加上 .json,或者如下更新行,否则服务器试图 return a html,因为我没有为它创建模板,所以我得到了 500 错误。
b) 最后一步是避免在 routing.yml 处声明路由 'individually',并将其作为“手动”fosrestbundle 路由注释包含在用于休息类型路由的控制器上。
api_venues:
type: rest
resource: Acme\DemoBundle\Controller\Api\VenueController