如何修复针对ajax请求阻止的跨源请求(在Firefox中)?

时间:2017-01-24 08:03:21

标签: javascript ajax

我在Firefox中的ajax请求中收到以下错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://www.example.org/php/save.php. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

我试图找出为什么会这样。这很奇怪,

  • 该脚本在同一服务器上的子域中完全正常工作
  • 访问的文件位于同一台服务器上

我也试过

xhttp = new XMLHttpRequest({mozSystem: true});

如此处所示:https://stackoverflow.com/a/22392080

但这也无济于事。

我使用以下命令打开请求:

xhttp.open('POST', '/php/save.php', true);

当文件在另一台服务器上时,我找到了许多其他解决方案:

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

但如果文件实际位于同一台服务器上,我不明白为什么要这样做...

修改

我从.htaccess文件中删除了以下两行,现在它可以正常工作。

RewriteCond     %{HTTP_HOST}    !^www\.example\.org$                        [NC] 
RewriteRule     .?              http://www.example.org%{REQUEST_URI}        [R=301,L]

虽然我不确定为什么......也许添加www.就像移动到子域一样?

我需要将哪些内容添加到.htaccess文件中才能使其与ajax和重写一起使用?

2 个答案:

答案 0 :(得分:1)

这就解决了我的问题 - 虽然我不知道为什么。而不是我使用之前使用的重写:

RewriteCond %{HTTP_HOST} !^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://www.example.org/$1 [R=301,L]

答案 1 :(得分:0)

出于安全原因,浏览器会限制从脚本中发起的跨源HTTP请求。例如,XMLHttpRequest和Fetch遵循同源策略。因此,使用XMLHttpRequest或Fetch的Web应用程序只能向其自己的域发出HTTP请求。

要在不同的域中启用您的请求,您可以:

  • 启用跨源资源共享(推荐)

CORS是一种标准机制,可供所有浏览器用于实现跨域请求。您指定一组允许浏览器和服务器进行通信的标头。

有用的资源: http://enable-cors.org/

  • 使用反向代理。

  • 使用JSONP(仅在需要读取数据时才有效)。

更多信息: https://en.wikipedia.org/wiki/Cross-origin_resource_sharing