困扰了很久的PHP跨域问题
其实这个问题一直是不存在的,只是自己因为各种配置吧,导致了这个问题一直没有解决。现在就解决思路提供如下:
需要两步操作
一、修改Nignx配置文件
一般在宝塔面板伪静态中设置
示例代码:
location / {
if ($request_method = 'OPTIONS') {
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Methods '*';
# add_header Access-Control-Allow-Credentials true;
add_header Content-Type 'application/json; charset=utf-8';
add_header Content-Length 0;
return 204;
}
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Methods '*';
# add_header Access-Control-Allow-Credentials true;
}
以上注意:
- 重复的内容不要删除;
- 为了提高效率,重复的正常请求放在
OPTIONS
之后 OPTIONS
中return 204
可以改成return 200
- nignx配置文件中之允许出现一次
location /
,所以在用伪静态情况下,需要将location /
中的内容和伪静态中的location /
进行合并。
二、PHP在入口文件加入以下代码
一般最好是Index文件中加入,没有其他输出项之前
header("Access-Control-Allow-Origin: *");
header("Access-Control-Expose-Headers: *");
header("Access-Control-Allow-Headers: *");
header('Access-Control-Allow-Methods: *');
//拦截OPTIONS请求
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header("Access-Control-Max-Age: 1728000"); //控制OPTIONS请求缓存时间
exit();
}
特别注意:
- 以上代码最好不要修改
Nginx
和PHP
代码都要加,不能只加1个地方Nginx
中的Access-Control-Allow-Origin
和PHP
中的Access-Control-Allow-Origin
要设置一至,不要一个是:*
,一个是:origin
;否则绝对报错- 以上设置完成后,基本上就没问题了,而大部分时间都出问题了,那么就看option请求返回有没有php版本号,如果没有,那么就被web服务拦截了,具体百度:
iis处理option请求
,apache处理option请求
,nginx处理option请求
按照相应的教程处理即可。