nginx 配置遇到的一个怪事,请教各位

2020-04-24 16:59:35 +08:00
 keroppi

给 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;
    }

}
3705 次点击
所在节点    NGINX
30 条回复
huijiewei
2020-04-24 18:22:42 +08:00
@keroppi 试试这个
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Methods * always;
keroppi
2020-04-24 18:59:06 +08:00
@huijiewei

依然不行。。
keroppi
2020-04-24 18:59:21 +08:00
@lower http 也是一样的问题
vindurriel
2020-04-24 19:47:18 +08:00
fastcgi_param HTTP_HOST your.domain.com;
canwushuang
2020-04-24 23:56:35 +08:00
san.html 里面的问题?
canwushuang
2020-04-25 00:00:16 +08:00
触发了同源策略?
ligolas
2020-04-26 08:59:27 +08:00
回头看最初的报错,是 prefight 请求的时候没有通过 cors 检查,所以出问题的是 options 请求,不是 post 请求,因为不了解你的网络实际情况,不确定中间还有没有别的 nginx 之类的,所以你先用 postman,发一个 options 请求过去,看看返回的 header 里面的服务器信息,来确定到底是什么服务器回应了这个 options 请求
ligolas
2020-04-27 09:10:44 +08:00
keroppi
2020-04-29 10:55:20 +08:00
@ligolas 感谢,我会先测试下,不过没有中间的 nginx 了
ligolas
2020-05-21 14:53:06 +08:00
@keroppi 估计过了时间,这个问题已经被你放下了,昨天正好帮一个小伙儿看 cors 的问题,然后想起你这个帖子了。
梳理了一下,然后再结合你发的图,你的 PHP 的跨域配置中,设置了 Access-Control-Allow-Headers Content-Type, 但是 nginx 上并没有,而你的 Content-Type 正好是简单请求之外的。所以你把 nginx 的那项配置改为 add_header Access-Control-Allow-Headers X-Requested-With, Content-Type; 大概率应该可以了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/665745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX