使用 PHP 的 CORS(跨源资源共享)

Posted

技术标签:

【中文标题】使用 PHP 的 CORS(跨源资源共享)【英文标题】:CORS (cross origin resource sharing) using PHP 【发布时间】:2016-03-03 07:41:47 【问题描述】:

我刚刚关注了 CORS 的 php 标头,我在这里有一个奇怪的行为,我创建了两个简单的页面 一个页面(content.php)使用端口 1112,另一页面(sample.html)使用我本地机器上的端口 1113 我注意到奇怪的行为 sample.html 试图从 content.php 中检索信息 这是两个页面的代码 示例.html

<!DOCTYPE html>
<html>
<head>
<title>Sample</title>
<script type="text/javascript">
    var xmlhttp = new XMLHttpRequest();
    function makerequest(serverPage, objID) 
        var obj = document.getElementById(objID);
        xmlhttp.open("POST", serverPage);
        xmlhttp.onreadystatechange = function() 
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
                obj.innerHTML = xmlhttp.responseText;
            
        
        xmlhttp.send();

</script>
<body onload="makerequest ('http://localhost:1112/content.php','hw')">
<div align="center">
<h1>Sample</h1>
<div id="hw"></div>
</div>
</body>
</html>

和其他页面 内容.php

<!DOCTYPE HTML>
<html>
<head>
<?php
header("Access-Control-Allow-Origin: http://localhost:1113/sample.html");
?>
<title>page1</title>
</head>
<body>
<div style="width: 770px; text-align: left; color: green;">
<h1>Page 1</h1>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod?
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, ?
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.?
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu ?
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in?
culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</body>
</html>

现在,当我尝试使用 chrome 和 firefox 运行 sample.html 时,即使我在标题中提供原始链接,它也会被阻止 如果我使用 IE 运行它就可以了 为了使它工作,我需要提供与我想要做的不同的标题( * ) 我试图弄清楚为什么它在 chrome 和 firefox 中不能正常工作

这是我从 chrome 获得的错误消息 XMLHttpRequest 无法加载 http://localhost:1112/content1.php。 “Access-Control-Allow-Origin”标头的值“http://localhost:1113/sample.html”不等于提供的原点。因此,不允许访问 Origin 'http://localhost:1113'。

【问题讨论】:

不幸的是,我相信无论本地主机如何,您都会遇到 CORS 问题,请考虑尝试使用本地 IP。此外,您可能需要实际配置您的网络服务器以发送标头,CORS 是一些挑剔的东西。此外,对于 Chrome,您需要这些附加标头:Access-Control-Allow-Headers 和 Access-Control-Allow-Methods。 CORS 是否只影响本地主机? 【参考方案1】:

对您的代码进行以下更改:

文件:content.php

<?php
//header("Access-Control-Allow-Origin: http://localhost:1113/sample.html");
header("Access-Control-Allow-Origin: http://localhost:1113");

?>

它应该可以工作。

SOP 强制执行的同源定义(并且 CORS 有助于绕过)是:“如果两个页面的协议、端口和主机相同,则两个页面具有相同的源。”。

在您的代码中,您应该添加 CORS 标头以反映浏览器允许显示“content.php”内容的来源因此您必须将“来源”指定为标头值,即http://localhost:1113(不是'http://localhost:1113/sample.html')

此外,声明“很遗憾,我相信无论使用 localhost 的情况如何,您都会遇到 CORS 问题,请考虑尝试使用本地 IP。”在弗雷多的回答是不正确的。浏览器在判断来源时会一并处理[scheme+host+port]。因此,使用具有不同端口号的 localhost 应该被视为不同的来源,没有任何问题。

【讨论】:

实际上现在我知道我是否只是将标题设置为以下它工作正常 header("Access-Control-Allow-Origin: localhost:1113"); 这就是我使用你的方法发现的您写的文章现在可以正常工作了,再次感谢亲爱的 Gaurab 的关心【参考方案2】:

尝试添加这些标题:

"Access-Control-Allow-Headers: Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With"

"Access-Control-Allow-Methods: GET, PUT, POST"

如果 apache 在您的 httpd.conf 或 .htaccess 中,则将其添加为服务器方法而不是通过 PHP 中的页面也可能会有所帮助。

这个答案来自这篇博文(使用 node.js / express)http://williambert.online/2013/06/allow-cors-with-localhost-in-chrome/

【讨论】:

现在我使用了您的标头,结果相同,没有任何更改 header("Access-Control-Allow-Origin: localhost:1113/sample.html"); header("Access-Control-Allow-Headers: Cache -Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With"); header("Access-Control-Allow-Methods: GET, PUT, POST"); 删除在哪里?【参考方案3】:
You may add following lines in  .htaccess code where you have palce sample.html

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

 In sample.html file add below headers on top.

 header("Access-Control-Allow-Origin:*");

【讨论】:

没有在 htaccess 中添加任何标题它正在工作我只是在 apache 中定义了虚拟主机,现在它工作正常再次感谢您的回答

以上是关于使用 PHP 的 CORS(跨源资源共享)的主要内容,如果未能解决你的问题,请参考以下文章

PHP 跨域资源共享 CORS 设定

CORS(跨源资源共享)https 不工作(IIS 托管 WCF 休息启用端点)

Fusion Tables 不支持 CORS(跨源资源共享)?

跨源资源共享(CORS)-亲测理解,以及对http的状态,参数的理解和使用,对预检请求的触发和解决

python 具有跨源资源共享的瓶子(CORS)

即使存在所有 CORS 标头,也存在跨源资源共享问题