【问题标题】:Why XMLHttpRequest doesn't work with "www."?为什么 XMLHttpRequest 不适用于“www.”?
【发布时间】:2012-08-20 13:51:02
【问题描述】:

我有以下代码:

var params = {
            cache:false, 
            dataType:"json", 
            type:"GET",
            url: "/order.php",
            error: function(data){
                dump(data);
            },
            success: function (data){
              alert('ok');
            },
            data:{
                js:1
            }
        };

$.ajax(params);

因此,如果我运行 example.com,它会完美运行。 但是,如果我运行 www.example.com,我会通过函数 dump() 得到一个错误。 Google 控制台显示错误:

XMLHttpRequest 无法加载 =1345470451769">http://example.com/order.php?js=1&tariff=247&=1345470451769. 来源 http://www.example.com 不被 Access-Control-Allow-Origin 所允许

什么意思?

所以我不需要从 www.domain.com 到 domain.com 的任何永久重定向。

提前感谢您的帮助。

更新 1: 我添加了功能:

function getBaseUrl()
{
   var baseUrl = '';
   baseUrl += location.protocol + '//';
   baseUrl += location.hostname;

   return baseUrl;
}

在 url:getBaseUrl() + "/order.php" 上更改 url: "/order.php"

遇到同样的错误。 我在这里做错了吗?

更新 2: 我将这个添加到 htaccess 文件中:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin http://sample.com http://www.sample.com
</IfModule>

似乎我的主机不支持它,因为我仍然收到 www 错误。

【问题讨论】:

  • 浏览器不允许页面对不同域中的 URL 进行 XHR(除非目标站点通过特殊标头明确允许它)。它被称为"Same Origin Policy"
  • 子域算作不同的域,即您遇到同源策略。
  • 这是否意味着我应该调用 url:'htp://www.sample.com/order.php' 代替?

标签: javascript jquery ajax redirect


【解决方案1】:

您遇到的错误意味着您无法将XMLHttpRequest 从一个域发送到另一个域,除非目标域在其响应标头中指定您可以这样做。这是浏览器强制执行的安全措施。

整个域必须匹配,因此 example.com 不能向 www.example.com 发出 XMLHttpRequest 请求,反之亦然。

您可以使用一些 javascript 根据当前文档位置获取 URL,或者使用相对路径。

还要确保网络服务器没有进行从一个域到另一个域的静默重定向,因为这也可能导致权限问题。

如果您有权访问网络服务器,另一种方法是将适当的跨域标头添加到响应中 - http://www.w3.org/TR/cors/

示例: Access-Control-Allow-Origin: http://www.example.com http://example.com

编辑:以上列表中的域需要用空格分隔,而不是逗号。

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://sample.com http://www.sample.com"
</IfModule>

【讨论】:

  • 我在这个例子中使用了相对路径,不是吗?
  • 如果您使用相对路径但它不起作用,我会指责网络服务器。确保它没有从一个域自动重定向到另一个域。使用其他解决方案更新了答案。
  • 没有自动重定向,因为我可以同时运行 sample.com www.sample.com
  • 好的,谢谢。我认为我会将基本 href 位置添加到我的 GET 链接中。
  • 尝试添加我建议的响应标头。您可以通过全局网络服务器执行此操作,也可以仅在处理请求的脚本上执行此操作。
【解决方案2】:

子域被视为与same origin policy 不同的域。如果您的站点功能有或没有 www,请使用相对路径。

如果服务器重定向,为什么当前页面不在www上?

从 SEO 的角度来看,您可能希望服务器将重定向到 URL 的一个版本或另一个版本。

【讨论】:

  • 不幸的是,我无法从 www\ 进行重定向。到 \。正如你所说,这取决于 SEO。
  • 比 cors 是你的答案,但它会在旧浏览器上失败。
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 2015-01-31
  • 1970-01-01
  • 2021-06-22
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
相关资源
最近更新 更多