【问题标题】:jQuery cross-domain AJAX request works on one page, but not anotherjQuery 跨域 AJAX 请求在一个页面上有效,但在另一个页面上无效
【发布时间】:2015-06-20 23:02:57
【问题描述】:

这是一个我无法弄清楚的奇怪情况。

我正在我的网站上发出一个跨域 AJAX 请求,从它的 http 域到它的 https 域。我正在通过两个不同页面上的按钮执行此操作。在一页上,请求工作正常,我可以从 Firebug 看到我的会话 cookie 已正确发送到服务器。在另一个页面上 - 在相同的域和 URL 结构下 - 没有发送任何 cookie。

例如工作于http://www.example.com/en/apples
但不适用于http://www.example.com/en/oranges

代码如下:

var ajaxUrl = "https://www.example.com/en/controller/add/bananas/";

jQuery.ajax({
    type: "GET",
    url: ajaxUrl,
    xhrFields: {
         withCredentials: true
    },
    crossDomain: true,
    success: function(data) {
      console.log("Yay");
    }
  }
);

我的https 网站回复:

Header add Access-Control-Allow-Origin      "http://www.example.com"
Header add Access-Control-Allow-Credentials "true"

我知道它有效,因为它适用于/apples,但完全相同的代码不适用于/oranges!这是怎么回事?

【问题讨论】:

  • 您不能从http 页面发出https 请求。我什至怀疑你的第一个案例是如何运作的
  • 有一些方法可以让 http ajax 调用 https 页面。首先,您确定/apples/oranges 的原始标头相同吗?请用 Chrome 或 FF 进行检查。
  • @Drakes 标题肯定都是一样的,除了 Referer 与您期望的不同。并且/oranges 页面没有在请求中发送Cookie 标头(这是问题所在)。

标签: javascript php jquery ajax cookies


【解决方案1】:

仍然不确定为什么它只在一个页面上工作,但在另一个页面上却没有,但是我通过 Apache 的 conf.d 文件向 HTTPS 服务器添加更多标头来修复它:

<IfModule mod_headers.c>
    Header add Access-Control-Allow-Origin      "http://www.example.com"
    Header add Access-Control-Allow-Credentials "true"
    Header add Access-Control-Allow-Methods     "GET, POST"
    Header add Access-Control-Allow-Headers     "Content-Type, Authorization, X-Requested-With"
    Header add Access-Control-Max-Age           "1000"
</IfModule>

两个页面现在都可以使用了。

还要检查:
Why is jquery's .ajax() method not sending my session cookie?
How do I send a cross-domain POST request via JavaScript?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多