浏览器无法对不支持CORS的服务器进行远程请求

时间:2014-05-09 15:33:20

标签: javascript debugging xmlhttprequest cors fiddler

我正在开发一个需要通过浏览器通过JSON访问远程服务器的Web应用程序,但远程服务器不支持CORS。服务器最终将支持CORS。但是我需要浏览器在开发和测试阶段访问远程服务器。

如何让浏览器允许来自未启用CORS的服务器的响应?

较新的浏览器对跨源资源共享(CORS)具有安全限制。对于这些浏览器,如果来自服务器的响应头不包含“Access-Control-Allow-Origin:*”,则浏览器可能会引发错误,例如: enter image description here

3 个答案:

答案 0 :(得分:1)

在测试和调试中可能存在您希望允许CORS但无法更改服务器以允许CORS的情况。有几个选项可以解决这个问题。在这里,我将讨论使用Fiddler来解决这个问题。

通过使用Fiddler,我可以看到应该从支持CORS的服务器返回的结果。 “访问控制允许来源:*”
enter image description here

但是发生的问题是远程服务器没有在响应头中返回“Access-Control-Allow-Origin:*”。

为了解决这个问题,我们可以指示Fiddler将响应标题“Access-Control-Allow-Origin:*”添加到所有响应中。

要做到这一点,请打开Fiddler自定义规则(见图)。

enter image description here

在代码部分OnBeforeResponse

中添加以下代码
static function OnBeforeResponse(oSession: Session) {
   if(!oSession.oResponse.headers.Exists("Access-Control-Allow-Origin"))
   {
        oSession.oResponse.headers.Add("Access-Control-Allow-Origin", "*");
   }                        

现在,您的浏览器应该能够访问不支持CORS的服务器。此解决方案的一个问题是您必须运行Fiddler。

答案 1 :(得分:1)

我最近遇到了同样的问题..所以添加了一个中间服务器并使该服务器与cors不支持的服务器进行通信。因为cors仅被浏览器阻止,所以我正在从中间服务器进行此调用并绕过问题。

https://gist.github.com/HarishAtGitHub/c2fd954f377a895473c5

enter image description here

这个想法是这样的:  如果您正在与之通信的服务器不支持cors,请引入支持cors的中间服务器,并从中间服务器调用不支持cors的服务器。 它对我来说就像一个魅力。

在那个剧本中 https://cors-unsupported-server - cors不支持的服务器 脚本interimserver.py - cors支持中间服务器

你必须调用localhost:5000 / orc并提交请求(注意:如果你希望其他人只是将httpmethod改为所需的那个,那么脚本只有帖子)。 临时服务器会将其转发给不受支持的服务器,并获得回复并将其转发给您。

故事的道德:

只有浏览器端脚本需要遵守规则(因为broswer以执行一些额外的操作(如设置HOST头)的形式强加规则。(此HOST头是告诉服务器请求来自哪里的。如果您可以更改这个主机是cors-unsupported服务器的主机,也可以工作。[如何确认?将我的脚本中的HOST头设置为域而不是cors-unsupported服务器,你看到脚本甚至失败。现在设置它对于cors-unsupported服务器,你会发现它正常工作。])。

我的服务器端脚本不遵守浏览器规则。我会做任何事。

答案 2 :(得分:1)

尽管这是一个古老的问题,但我希望此答案对寻求避免CORS政策的廉价临时补丁的人有所帮助。

如果您使用的是Google Chrome浏览器,则可以使用一个命令行选项来禁用CORS限制。 只需创建一个新的纯文本文件并将其放入:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --disable-gpu --user-data-dir=~/chromeTemp

只需在Windows中将此文件另存为 something.bat ,即可简化其使用。或者,您可以直接在终端中使用修饰符(对于Windows / unix环境均适用)。

重要的旁注: 对于开发环境而言,这只是一种廉价,快速且肮脏的解决方法。对于生产环境或用户,请不要考虑这种可能性。 修复CORS的最佳方法是在服务器端真正修复CORS标头。