2

我有以下代码:

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() 得到一个错误。谷歌控制台显示错误:

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

这是什么意思?

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

提前感谢您的帮助。

更新1: 我添加了功能:

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

   return baseUrl;
}

并更改 url: "/order.php" on url: getBaseUrl() + "/order.php"

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

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

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

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

4

2 回答 2

4

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

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

您可以只使用一些 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>
于 2012-08-20T13:53:49.743 回答
2

子域被视为具有相同来源策略的不同域。如果您的站点功能有或没有 www,请使用相对路径。

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

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

于 2012-08-20T13:55:33.043 回答