PHP-AJAX CORS 由于 Access-Control-Allow-Origin 而失败
Posted
技术标签:
【中文标题】PHP-AJAX CORS 由于 Access-Control-Allow-Origin 而失败【英文标题】:PHP-AJAX CORS Fails due to Access-Control-Allow-Origin 【发布时间】:2016-09-09 07:20:09 【问题描述】:我正在尝试使用以下代码进行 AJAX 调用 (CORS):
$.ajax(
type: "POST",
url: 'http://localhost/MySpace',
success: function(result)
console.log(result);
,
error: function()
console.log("error");
,
);
我正在运行上面的代码:
http://127.0.0.1/Test/index.html
http://localhost/MySpace
写的php代码如下:
<?php
header("Access-Control-Allow-Origin: *");
echo "Hello";
?>
根据我的理解,这应该有效。但是我收到了这个错误:
XMLHttpRequest cannot load http://localhost/MySpace. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1' is therefore not allowed access.
我该怎么做才能完成这项工作?还是我做错了什么?
根据调试请求的建议,我尝试发出 curl 请求:
curl -i http://127.0.0.1/MySpace/
作为回应,我可以看到Access-Control-Allow-Origin
被标记为*
:
HTTP/1.1 200 OK
Date: Fri, 13 May 2016 05:59:19 GMT
Server: Apache/2.4.18 (Unix) OpenSSL/1.0.2g PHP/5.6.19 mod_perl/2.0.8-dev Perl/v5.16.3
X-Powered-By: PHP/5.6.19
Access-Control-Allow-Origin: *
Content-Length: 5
Content-Type: text/html; charset=UTF-8
根据评论,我将以下代码添加到我的.htaccess
:
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"
@编辑:
这是我的响应标头:
HTTP/1.1 301 Moved Permanently
Date: Fri, 13 May 2016 09:26:44 GMT
Server: Apache/2.4.18 (Unix) OpenSSL/1.0.2g PHP/5.6.19 mod_perl/2.0.8- dev Perl/v5.16.3
Location: http://localhost/elasticservice/
Content-Length: 240
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1
这是我的请求标头:
POST /elasticservice HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 0
Cache-Control: max-age=0
Accept: */*
Origin: http://127.0.0.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36
Referer: http://127.0.0.1/test/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,hi;q=0.6
【问题讨论】:
尝试 .htaccess 解决方案与访问允许来源。 我尝试添加 .HTACCESS。但它仍然无法正常工作。我已经编辑了问题并添加了 .HTACESS 内容<FilesMatch "\.(eot|ttf|otf|woff|xml|jpg|jpeg)$"> <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> </FilesMatch>
我正在使用这个.htaccess
代码块来提供我的cordova ios 应用程序。您可以更改文件类型或授予所有文件类型的权限。
【参考方案1】:
您已允许 CORS Origin,因此对于访问跨域 3 标头 (Origin, Methods, Headers)
强制,请参阅下面的示例标头
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
@update: 你可以试试这个解决方案
header('Access-Control-Allow-Origin: *');
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS')
$headers=getallheaders();
@$ACRH=$headers["Access-Control-Request-Headers"];
header("Access-Control-Allow-Headers: $ACRH");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
【讨论】:
您是否更改了 api 请求标头中的Access-Control-Allow-Headers:
值?
api 请求标头?我只有三个文件:.php
AJAX 服务,.html
正在进行 AJAX 调用,HTACCESS
如评论中所建议。
我的意思是,检查浏览器控制台中的 ajax 请求标头并将所有内容添加到 Access-Control-Allow-Headers
中,它们可能会有所不同。
我尝试了建议的更改。它也没有工作。我觉得使用127.0.0.1
和localhost
有一些问题。但实际上我无法在此使用任何 URL。我已经对我的请求和响应标头进行了编辑
您需要在通过 AJAX 而不是 htaccess 调用的脚本中添加 header('Access-Control-Allow-Origin: *');
【参考方案2】:
试试下面的网址:
$.ajax(
type: "POST",
url: 'http://127.0.0.1/MySpace',
success: function(result)
console.log(result);
,
error: function()
console.log("error");
,
);
【讨论】:
这很有效。因为对于 localhost,它不会被视为 CORS。以上是关于PHP-AJAX CORS 由于 Access-Control-Allow-Origin 而失败的主要内容,如果未能解决你的问题,请参考以下文章
Apple Safari 仍未设置第三方域 CORS cookie?