CORS 在 PHP 中不工作
跨域资源共享 (CORS) 允许您从一个域向另一个域发出请求。当从不同的域发出请求时,浏览器会检查服务器的响应以查找指示是否允许该请求的特定标头。
问题:
开发人员正在尝试发送使用 CORS 从 www.siteone.com 到 www.sitetwo.com 的 POST 请求。然而,尽管在服务器上设置了必要的 CORS 标头,他们还是遇到了“Access-control-Allow-Origin 错误”。
请求/响应标头:
Response Headers Connection Keep-Alive Content-Length 487 Content-Type text/html; charset=iso-8859-1 Date Fri, 23 Aug 2013 05:53:20 GMT Keep-Alive timeout=15, max=99 Server Apache/2.2.15 (CentOS) WWW-Authenticate Basic realm="Site two Server - Restricted Area" Request Headers Accept */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 43 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host www.sitetwo.com Origin http://www.siteone.com Referer http://www.siteone.com/index.html User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:23.0) Gecko/20100101 Firefox/23.0
解决方案:
问题在于服务器上设置 CORS 标头的方式。原始代码使用了简化的方法,仅包含以下标头:
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
但是,根据 CORS 规范,正确处理请求需要更全面的方法。开发人员将代码更新为以下内容:
if (isset($_SERVER['HTTP_ORIGIN'])) { header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 86400'); // cache for 1 day } if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); exit(0); } // Your actual code goes here echo "You have CORS!";
此更新的代码不仅设置基本的 CORS 标头,还处理预检 OPTIONS 请求,浏览器使用这些请求来确定是否允许实际请求。通过实施这种更彻底的方法,开发人员成功为其应用程序启用了 CORS。
以上是当我在 PHP 中设置 CORS 标头时,为什么仍然收到'Access-Control-Allow-Origin”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!