我的node.js webapp几乎准备好投入生产,但现在我遇到了一个大问题。直到今天,所有测试都是使用浏览器和我的vps的IP地址完成的。现在我有一个链接到我的vps服务器的域名。从这一刻起,我无法使用ajax调用! Chrome控制台说:
> The 'Access-Control-Allow-Origin' header is present on the requested resource
> Origin 'http://example.com' is therefore not allowed access.
我知道CORS认为从域A到域B的资源访问权限。所以也许,通过设置一些标题来解决这个问题ojbect不是最好的解决方案,或者可能是。
我试过这个
res.setHeader('Access-Control-Allow-Origin', 'http://example.com');
res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
但只有在我向浏览器写http://example.com时它才有效。如果我写http://www.example.com,它不起作用因为原点(http://www.example.com)因res对象(http://example.com)中设置的原点而不同;这是chrome的cosole错误:
' Access-Control-Allow-Origin' header有一个值 ' http://example.com'这不等于提供的原产地。 起源' http://www.example.com'因此不允许访问。
我怎能避免它?使用allow-origin *对我的情况不是一个好的解决方案,但最大的问题是: 这是使这一切工作的正确方法吗?允许我的域名? o有什么东西我不理解吗?
修改 这个问题似乎与CORS无关。经过测试,似乎如果您通过浏览器www.example.com访问,并且从客户端javascript执行对example.com的ajax调用,则请求失败(具有访问控制错误)。如果您访问example.com并且您向www.example.com进行了ajax调用,那么情况也是如此。这是一个问题,用户必须可以通过键入www.example.com或example.com自由访问我的页面。怎么解决这个问题?
答案 0 :(得分:1)
这是猜测,因为您还没有发布任何代码,但似乎您可能在客户端代码中对绝对URL进行硬编码。
$.get('http://www.example.com/some/url', ...);
不要这样做。使用相对URL,浏览器将自动将请求发送到正确的源。
$.get('/some/url', ...);
另一方面,您不应该从不同的域(www.example.com和example.com)提供相同的网站,因为它会损害SEO。相反,选择哪个应该是规范域,并从另一个域发出永久(HTTP 301)重定向。