【问题标题】:Issue with Access-Control-Allow-Origin on server服务器上的 Access-Control-Allow-Origin 问题
【发布时间】:2014-06-07 02:25:15
【问题描述】:

我有一个位于 Web 服务器上的 php 文件,该文件具有以下代码以允许从其他域访问它:

header('content-type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 

当我从测试服务器发出请求时,我会在 Chrome 开发工具上得到响应

> XMLHttpRequest cannot load http://beta.dean.technology/proxy.php. No
> 'Access-Control-Allow-Origin' header is present on the requested
> resource. Origin 'http://localhost' is therefore not allowed access.

我提出的一个示例请求是JSFiddle

$.ajax({url: 'http://beta.dean.technology/proxy.php',type:"POST",data: '{}',contentType:"application/json",dataType:"json"})

我还使用了在线 HTTP 标头检查器,他们的回复是“Access-Control-Allow-Origin: *”。我也将此文件放在不同的服务器上,结果仍然相同。正常访问url即可访问该文件。

有没有人对这个问题有任何想法。

编辑 1: PHP 源文件 http://beta.dean.technology/proxySource.txt

【问题讨论】:

  • 我最近一直在使用 CORS,遇到了诸如此类的飞行前请求的各种问题。我建议查看JSONP,因为这对我的发展有很大帮助。
  • 我的代码就像一个代理来解决这个问题,效果很好,直到我把它放到部署服务器上。它用于发布数据并获取结果。不幸的是 JSONP 不支持 POST
  • 您是否有说明 JSONP 不支持 POST 的消息来源?我正在使用 AJAX $.post 请求使用 JSONP 没问题。

标签: javascript php jquery ajax cors


【解决方案1】:

确保在 OPTIONS 飞行前请求中发出标头。您不需要在 GET 或 POST 请求上发出它,您可以发出它们,但它不会做任何事情。

在发出实际的 POST 请求之前,您的浏览器会发出一个飞行前请求,它是一个 OPTIONS 请求。

if ($_SERVER['REQUEST_METHOD'] === "OPTIONS") {
    // emit CORS headers
    exit;
} else {
    // regular request
}

【讨论】:

  • 这不解决问题,仅在“用户”访问页面时省略标题。我希望所有设备/方法都可以随时访问该页面。
  • 这无关紧要。我的观点是:验证标头是否在 OPTIONS 请求中发出,因为该错误消息似乎表明它们不是: No 'Access-Control-Allow-Origin' header is present on the requested resource 。 ..
  • 很抱歉打了个激战。我已经使用了您的代码,并在选项请求中看到,它没有回复 Access-Control-Allow-Origin 但回复 pastebin.com/z89Up5K4
  • 看看你是否能弄清楚是什么在处理 OPTIONS 请求。我对 IIS 不够熟悉,无法判断它是否对 OPTIONS 请求进行了处理。确保它已处理到您的 PHP 脚本中。
猜你喜欢
  • 2019-02-13
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 2023-02-14
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多