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 内容 &lt;FilesMatch "\.(eot|ttf|otf|woff|xml|jpg|jpeg)$"&gt; &lt;IfModule mod_headers.c&gt; Header set Access-Control-Allow-Origin "*" &lt;/IfModule&gt; &lt;/FilesMatch&gt; 我正在使用这个.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.1localhost 有一些问题。但实际上我无法在此使用任何 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 而失败的主要内容,如果未能解决你的问题,请参考以下文章

Angular、CORS 和 Spring 的问题

ajax跨域(跨源)方案之CORS

CORS 已启用,但仍会收到 405

Apple Safari 仍未设置第三方域 CORS cookie?

PHP-AJAX:如何通过 php/json 数组从查询中填充 jquery 数据表

PHP-AJAX