为啥同源策略限制对 Ajax 的访问,而不限制对 Php 的访问?

Posted

技术标签:

【中文标题】为啥同源策略限制对 Ajax 的访问,而不限制对 Php 的访问?【英文标题】:Why Same-Origin policy restricts access to Ajax but not to Php?为什么同源策略限制对 Ajax 的访问,而不限制对 Php 的访问? 【发布时间】:2014-09-17 13:57:44 【问题描述】:

我正在处理这个webservice,它返回一个 XML 文档。

当我用 Ajax 调用这个网络服务时,我得到:

XMLHttpRequest cannot load http://services.gisgraphy.com/geoloc/search?lat=36.81881&lng=10.16596&from=1&to=1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.1.4:50000' is therefore not allowed access. 

什么时候用 php 做同样的事情:

<?php
    $xml = simplexml_load_file('http://services.gisgraphy.com/geoloc/search?lat=50.209298&lng=10.245&from=1&to=1');
    print_r($xml);
?>

不受限制地打印。

我只是想知道这些情况之间的区别,以及为什么它只适用于 php 文件?

干杯。

【问题讨论】:

看到这个***.com/questions/20035101/… thx,我知道有很多方法可以打破同源限制,但我只想了解.. 如果您拥有两个域并且想要进行跨域前端 ajax 调用,您可能会查看 CORS 和 JSONP 【参考方案1】:

当您运行 PHP 代码时,您是在自己的服务器上执行的。什么都不应该 限制您访问其他网站,因为它是您的服务器。

当您运行 javascript 代码时,您通常在客户端上运行它 网页浏览器。您不拥有客户端计算机。和客户端机器 希望保护自己不连接到恶意网站。

想象一下没有同源政策:

$.ajax(
  url: "http://somedrugdealingwebsite.com"
)

客户的 IP 将被注册为毒品交易网站的访问者。

【讨论】:

这实际上是不准确的,如果您运行 Web 调试器,很容易被证明是错误的。您的请求顺利通过 - 浏览器阻止响应,而不是请求。事实上,在服务器响应之前,浏览器并不知道服务器是否实现了 CORS。【参考方案2】:

简而言之,因为同源策略是由浏览器执行的,而不是服务器。如果您在发出 Ajax 请求时运行了 Fiddler 或类似的东西,您会看到响应实际上返回正常。是浏览器拒绝它。

对于您的 PHP 请求,您是从服务器请求,而不是从脚本(浏览器)请求。需要明确的是,PHP 始终从服务器而不是客户端运行(这似乎是一种常见的误解)。

【讨论】:

以上是关于为啥同源策略限制对 Ajax 的访问,而不限制对 Php 的访问?的主要内容,如果未能解决你的问题,请参考以下文章

跨域限制原因及常见跨域方法

AJAX跨域解决方法

解决浏览器跨域限制发送ajax请求

在django中解决跨域AJAX

跨域请求的解决方案

html ajax访问webapi 跨域