【PHP】在PHP中处理js的跨域请求问题:Access-Control-Allow-Origin

版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。喜欢请关注哟~ https://blog.csdn.net/sjt223857130/article/details/83036276

在javascript与服务器的请求中,例如POST。

前提条件:如果你使用了自定义的headers参数content-type,将会被判定为复杂请求。

这时候,在请求数据之前,客户端会发出一个类型为options的预检数据。

用来让服务器确认此次的请求是否符合安全要求(跨域权限)。

如果服务器返回失败,则POST请求被拦截,请求失败!

也就是说,以post跨域请求为例,会发送两次请求。

第一次请求,为options预检。(此结果决定第二次请求是否发送)

第二次请求,为post正常请求。

这时候,我们需要在服务器上进行设置,允许哪些域名可以通过预检。

拿PHP服务器来举例,只需要在PHP代码中进行以下设置即可。

<?php

// 允许来自任何来源的设置方法
if (isset($_SERVER['HTTP_ORIGIN'])) {
    // 必须在 $_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
}

// 在OPTIONS请求期间接收访问控制头
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        // 也可能正在使用PUT,PATCH,HEAD等,根据需要自已添加
        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);
}

提示:在正式布署时,Access-Control-Allow-Origin,参数值最好改为指定的域名许可。

header('Access-Control-Max-Age: 86400');    // cache for 1 day 表示预检的缓存,通过一次多久后重发

这样就解决了js跨域请求的问题。

猜你喜欢

转载自blog.csdn.net/sjt223857130/article/details/83036276
今日推荐