为啥从 localhost 向 localhost 发出请求时会启动同源策略?

Posted

技术标签:

【中文标题】为啥从 localhost 向 localhost 发出请求时会启动同源策略?【英文标题】:Why is same origin policy kicking in when making request from localhost to localhost?为什么从 localhost 向 localhost 发出请求时会启动同源策略? 【发布时间】:2012-12-25 03:02:40 【问题描述】:

我将后端 API 作为一个单独的项目,与使用它的前端 html5 应用程序分开。我正在使用 Yeoman 进行前端开发。 Yeoman 在 localhost:3501 上运行,后端在 localhost:3000 上运行。当我从浏览器发出 API 请求时(使用 AngularJS 的 $http),我遇到了相同的来源策略:

XMLHttpRequest cannot load http://localhost:3000/venues. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.

AFAIK,只有在跨不同域发出请求时才应该启动同源策略。当我们从 localhost 向 localhost(尽管是不同的端口)发出请求时,为什么它会发牢骚?

我怎样才能完成这项工作,这会导致生产问题吗?

【问题讨论】:

【参考方案1】:

根据W3C,“来源是由 URL 的方案、主机和端口定义的”,因此不同的端口会导致您的问题。

两种可能的解决方案:

CORS(跨域资源共享) 使用 JSONP 请求

两者都需要对您的后端进行更改(我还不够熟悉。CORS 可能意味着对您的前端的更改最少(我认为 AngularJS 开箱即用地支持它)。

【讨论】:

【参考方案2】:

端口也计入跨域请求,因此http://localhost:3000http://localhost:35012 个不同的域(从浏览器的角度来看)。

如果您需要两个应用程序(客户端和后端)在不同的端口上运行,请考虑使用http://enable-cors.org/

【讨论】:

以上是关于为啥从 localhost 向 localhost 发出请求时会启动同源策略?的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 localhost 向 localhost:8000 发送数据时,ajax 调用不起作用

从 Android Emulator 向 localhost 发送文件 - 来自 localhost / PHP 文件问题的 301 错误响应

为啥我的 css 不能在 localhost.3000 上应用?

如何从 docker 容器向 localhost 发出请求?

为啥一旦我将主机从“localhost”更新为“mydomain.com”,Wordpress 会突然连接到 MySQL 数据库服务器?

为啥 Chrome 会删除 localhost:80 的端口号?