给 PHP 接口弄了个站点配置,代码已经设置好跨域
如果是在 PC 端访问 https://domain.com/demo/
能访问,正常
但如果前端 用 ajax 请求 https://domain.com/demo/
报跨域错误:
Access to XMLHttpRequest at 'https://domain.com/demo/' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
但奇怪的是代码不变,把接口地址改成具体的 php 文件地址如: https://domain.com/demo/index.php ,就正常了
站点配置:
server {
listen 80;
server_name _;
root /var/www;
index index.php index.html;
client_max_body_size 50m;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
charset utf-8;
location = /favicon.ico { access_log off; log_not_抗投诉服务器found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php:9000;
try_files $uri =404;
}
}
看配置来说,发起和请求的域名不一致应该都会出现跨域的提示,请求具体页面应该也会报错
那为什么填写完整的地址就不报错了呢?
贴下 network 看看请求
贴下 network 里面的 header
失败截图: https://sm.ms/delete/f76rInKMWTpgBC2zauXL1tEYQi
成功截图: https://sm.ms/delete/2ikWKhsAPZuLBEdQgOyTnpIDSG
https://domain.com/demo/index.php
失败截图: https://sm.ms/image/al7PTj5dEDbJzcQ
成功截图: https://sm.ms/image/M6y27VT19HWwGNB
index.php
这个页面的 header 里面有 cors header
/ 这里会路由到比如你的默认页面,这个里面没有 cors header 吧?
/ 是直接到 index.php ,而 index.php 有跨域设置的
例如用 Postman 测试的时候直接 post https://domain.com/demo/ 没有问题,就前端不行。
成功的部分,request headers 部分也截图出来下
是不是代码里面设置了跨域,Nginx 也配了跨域?
之前 Java 就是遇见过两个地方都配了 cors,然后就出现了这种情况
看看配置文件是不是没有改对文件,我记得外面有一个配置文件
你确认下前端是直接请求你接口还是自己 mok 了代理
你的配置文件里没有设置跨域啊
add_header Access-Control-Allow-Origin *;
你那不是 https 吗?? https 怎么配置的
NGINX 的 / 到 PHP 还有一次 30x 跳转,而你的 Nginx 并没有配置跨域可用,所以就出错了
解决办法就是 楼上的,Nginx 也配置一下
PHP 代码设置了,其实还是注意看 目录形式请求不可以,完整地址可以这点
https://sm.ms/image/Q9fe7Sr2Lvbxwns
另外 Postman 是 HTTP 请求测试工具,并没有浏览器跨域限制
在 nginx.conf
添加了
```
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
```
问题依然是一样,直接目录不行,完整的文件才可以
试试这个
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods * always;
依然不行。。
http 也是一样的问题
fastcgi_param HTTP_HOST your.domain.com;
san.html 里面的问题?
触发了同源策略?
回头看最初的报错,是 prefight 请求的时候没有通过 cors 检查,所以出问题的是 options 请求,不是 post 请求,因为不了解你的网络实际情况,不确定中间还有没有别的 nginx 之类的,所以你先用 postman,发一个 options 请求过去,看看返回的 header 里面的服务器信息,来确定到底是什么服务器回应了这个 options 请求
@keroppi
感谢,我会先测试下,不过没有中间的 nginx 了
估计过了时间,这个问题已经被你放下了,昨天正好帮一个小伙儿看 cors 的问题,然后想起你这个帖子了。
梳理了一下,然后再结合你发的图,你的 PHP 的跨域配置中,设置了 Access-Control-Allow-Headers Content-Type, 但是 nginx 上并没有,而你的 Content-Type 正好是简单请求之外的。所以你把 nginx 的那项配置改为 add_header Access-Control-Allow-Headers X-Requested-With, Content-Type; 大概率应该可以了。