我刚刚将应用程序移动到生产服务器,当我尝试使用"www"访问页面时出错当我尝试将我的页面加载为"http://example.com"它正确地加载页面和内容,当我尝试访问像"www.example.com"这样的页面时,我所有的ajax调用都会给出错误,比如:
XMLHttpRequest无法加载http://example.com/dashboard/.不请求的上存在"Access Control Allow Origin"标头资源原点'http://www.example.com因此不允许通道
我使用的是angular的PHP。
您的网站是否以同样的方式使用www?如果没有,也许你可以在htaccess中添加重写规则,所以有www和没有www的版本会起到相同的作用?在这种情况下,你不应该得到跨域错误
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
出现此问题是因为您没有在服务器端设置访问控制源。您可以通过在服务器端设置它来解决这个问题
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
当您从浏览器发出请求时,浏览器会进行预取(有时不会),在任何一种情况下,它都会检查Access-Control-Allow-Origin
是否真的允许您客户端的网站在不同的域上发出请求(网络安全)。如果这与您发送请求的位置不匹配,浏览器会阻止请求并不发送。
要发出请求,您需要编辑服务器端(在PHP上),您应该允许该域,它还支持通配符:
<?php
header("Access-Control-Allow-Origin: www.example.com");
?>
现在你可以从任何地方开始请求,你也可以将请求限制在特定的域,这样只有一个域可以向你发送请求,比如:
header("Access-Control-Allow-Origin: example.com");
这是意料之中的事。同源政策规定:
如果两个页面的协议、端口(如果指定了端口)、和主机相同,则两个页面具有相同的来源。
www.example.com
和example.com
是不同的主机名,因此您正在跨越原点。
虽然口语是指跨领域的请求,但重要的是跨来源的请求;跨域请求只是其中的一个子集。
不要在多个主机名上托管你的网站,选择一个并坚持使用。(你可能想设置从另一个到它的重定向)。
使用相对URI而不是绝对URI也可以减少这种错误的可能性。