带有php标头的CORS

123 javascript php xmlhttprequest cors

我有一个简单的PHP脚本,我正在尝试跨域CORS请求:

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...
Run Code Online (Sandbox Code Playgroud)

但我仍然得到错误:

X-Requested-With不允许请求标头字段Access-Control-Allow-Headers

我缺少什么?

sla*_*pon 263

正确处理CORS请求有一点涉及.这是一个将更充分(和正确)响应的功能.

/**
 *  An example CORS-compliant method.  It will allow any GET, POST, or OPTIONS requests from any
 *  origin.
 *
 *  In a production environment, you probably want to be more restrictive, but this gives you
 *  the general idea of what is involved.  For the nitty-gritty low-down, read:
 *
 *  - https://developer.mozilla.org/en/HTTP_access_control
 *  - http://www.w3.org/TR/cors/
 *
 */
function cors() {

    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            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);
    }

    echo "You have CORS!";
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,将HTTP Origin值作为允许来源发回将允许任何人使用cookie向您发送请求,从而可能会从登录您站点的用户窃取会话,然后查看攻击者的页面.您要么发送'*'(这将禁止cookie,从而阻止会话窃取)或您希望该网站工作的特定域. (25认同)
  • 确实,“$_SERVER['HTTP_ORIGIN]”并不“安全”,因为您的应用程序无法验证请求的真实来源。然而,保护这个标头是**浏览器的**工作。您的应用程序并不是试图阻止来自不同组织的人们使用它。相反,您的应用程序正在向浏览器确认此 URL 可接受来自某些域的跨站点请求。 (2认同)

KAR*_*ván 53

Access-Control-Allow-Headers不允许*作为可接受的值,请参阅此处的Mozilla文档.

您应该发送接受的标题(首先X-Requested-With是错误说明),而不是星号.

  • 截至 2021 年,根据 MDN 文档,“*”现在已被接受。 (4认同)

Fia*_*eid 44

我得到了同样的错误,并在我的后端脚本中使用以下PHP修复它:

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

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");
Run Code Online (Sandbox Code Playgroud)


Cso*_*mai 29

互联网范围内的许多描述都没有提到指定Access-Control-Allow-Origin是不够的.这是一个适合我的完整示例:

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
        header('Access-Control-Allow-Headers: token, Content-Type');
        header('Access-Control-Max-Age: 1728000');
        header('Content-Length: 0');
        header('Content-Type: text/plain');
        die();
    }

    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/json');

    $ret = [
        'result' => 'OK',
    ];
    print json_encode($ret);
Run Code Online (Sandbox Code Playgroud)

  • 请解释为什么这还不够,以及什么最小的例子*就足够了。 (2认同)

Fed*_*eco 22

我只是设法让dropzone和其他插件使用此修复程序(angularjs + php后端)

 header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization');
Run Code Online (Sandbox Code Playgroud)

将此添加到upload.php或您发送请求的位置(例如,如果您有upload.html,则需要将文件附加到upload.php,然后复制并粘贴这4行).此外,如果你在chrome/mozilla中使用CORS插件/插件,请确保多次切换它们,以便启用CORS


小智 11

如果要从PHP创建CORS服务,可以使用此代码作为处理请求的文件的第一步:

// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}
else
{
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
    header("Access-Control-Allow-Origin: *");
}

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600");    // cache for 10 minutes

if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    //Just exit with 200 OK with the above headers for OPTIONS method
    exit(0);
}
//From here, handle the request as it is ok
Run Code Online (Sandbox Code Playgroud)


小智 9

当使用 angular 4 作为客户端和 PHP 作为服务器端时,这些代码对我来说很有效。

header("Access-Control-Allow-Origin: *");
Run Code Online (Sandbox Code Playgroud)


小智 7

这应该有效

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
Run Code Online (Sandbox Code Playgroud)


sha*_*002 6

如果我们没有正确理解它的功能,CORS会变得很头疼.我在PHP中使用它们,它们可以正常工作.这里参考

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");
Run Code Online (Sandbox Code Playgroud)


小智 6

我使用了这 5 个标头,然后解决了 cors 错误(后端:PHP,前端:VUE JS)

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS, post, get');
header('Access-Control-Max-Age: 3600');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
header('Access-Control-Allow-Credentials: true');
Run Code Online (Sandbox Code Playgroud)