0

我想使用 jQuery v1.8.3 进行跨域 GET ajax 请求。

这是我的设置:

  1. 我有一个服务器,它为每个请求domain1.dev发出这些 CORS 标头:

    • Access-Control-Allow-Origin: *
    • Access-Control-Allow-Credentials: true
    • Access-Control-Allow-Methods: *
    • Access-Control-Allow-Headers: *
  2. 我有一个 Web 应用程序,它从被调用domain2.dev加载 javascript 。domain1.devdomain1.js

    在这个domain1.js文件中,我发出这个 AJAX 请求:

    jQuery.ajax('http://domain1.dev/path', {
        headers: {'Accept': 'application/json'},
        xhrFields: {
            withCredentials: true
        },
        statusCode: {
            200: function(data, textStatus, jqXHR) {
                // some logic
            },
            401: function(data, textStatus, jqXHR) {
                // some other logic
            }
        }
    })
    
  3. 我从加载页面domain2.dev。发出 AJAX 请求(没有预检)并且成功(状态代码 200)但 firebug 仍然以红色显示它(chrome 显示“已取消”),我不明白为什么。

任何的想法?

编辑:

由 发送的响应标头domain1.dev

Access-Control-Allow-Cred...    true
Access-Control-Allow-Head...    Accept, Accept-Encoding, Accept-Language,    Connection, Cookie, Host, Origin, Referer, User-Agent
Access-Control-Allow-Meth...    GET
Access-Control-Allow-Orig...    *
Cache-Control   private
Connection  keep-alive
Content-Type    application/json
Date    Thu, 22 Nov 2012 22:24:44 GMT
Server  nginx/1.2.3
Transfer-Encoding   chunked
X-Powered-By    PHP/5.4.6
x-debug-token   50aea62c91ee6

而请求标头是:

Accept  application/json
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Cookie  obfuscated=uk40mmmqbffues5cpn6omj6mf0; __utma=126865951.1486960365.1353615466.1353615466.1353619027.2; __utmz=126865951.1353615466.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=126865951
Host    domain1.dev:8080
Origin  http://domain2.dev:8080
Referer http://domain2.dev:8080/app_dev.php
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0
4

1 回答 1

3

在后端,您必须明确说明要允许的标头和方法。和响应标Access-Control-Allow-MethodsAccess-Control-Allow-Headers不支持通配符。

如果您想允许任何方法/标头,只需在(预检)请求中查找Access-Control-Request-Methods和标头,并返回文字值。Access-Control-Request-Headers

Access-Control-Allow-Origin而且,当withCredentials为真时,您不能使用通配符。要么使用与前面描述的相同的机制来模拟通配符,要么不使用withCredentials.

于 2012-11-22T22:02:06.753 回答