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

}
3690 次点击
所在节点    NGINX
30 条回复
linauror
2020-04-24 17:17:25 +08:00
看配置来说,发起和请求的域名不一致应该都会出现跨域的提示,请求具体页面应该也会报错
keroppi
2020-04-24 17:18:13 +08:00
@linauror 那为什么填写完整的地址就不报错了呢?
linauror
2020-04-24 17:21:37 +08:00
贴下 network 看看请求
xxyang
2020-04-24 17:25:52 +08:00
贴下 network 里面的 header
keroppi
2020-04-24 17:27:24 +08:00
ligolas
2020-04-24 17:27:54 +08:00
keroppi
2020-04-24 17:28:41 +08:00
ligolas
2020-04-24 17:30:01 +08:00
index.php
这个页面的 header 里面有 cors header
/ 这里会路由到比如你的默认页面,这个里面没有 cors header 吧?
keroppi
2020-04-24 17:31:58 +08:00
@ligolas
/ 是直接到 index.php ,而 index.php 有跨域设置的

例如用 Postman 测试的时候直接 post https://domain.com/demo/ 没有问题,就前端不行。
linauror
2020-04-24 17:32:45 +08:00
@keroppi 成功的部分,request headers 部分也截图出来下
wangyanrui
2020-04-24 17:34:38 +08:00
是不是代码里面设置了跨域,Nginx 也配了跨域?
之前 Java 就是遇见过两个地方都配了 cors,然后就出现了这种情况
icanbeyrhero
2020-04-24 17:53:00 +08:00
看看配置文件是不是没有改对文件,我记得外面有一个配置文件
jugelizi
2020-04-24 17:58:10 +08:00
你确认下前端是直接请求你接口还是自己 mok 了代理
580a388da131
2020-04-24 18:05:06 +08:00
你的配置文件里没有设置跨域啊

add_header Access-Control-Allow-Origin *;
lower
2020-04-24 18:07:47 +08:00
你那不是 https 吗?? https 怎么配置的
huijiewei
2020-04-24 18:09:19 +08:00
NGINX 的 / 到 PHP 还有一次 30x 跳转,而你的 Nginx 并没有配置跨域可用,所以就出错了

解决办法就是 楼上的,Nginx 也配置一下
keroppi
2020-04-24 18:09:24 +08:00
@580a388da131 PHP 代码设置了,其实还是注意看 目录形式请求不可以,完整地址可以这点
keroppi
2020-04-24 18:09:33 +08:00
huijiewei
2020-04-24 18:10:20 +08:00
另外 Postman 是 HTTP 请求测试工具,并没有浏览器跨域限制
keroppi
2020-04-24 18:19:24 +08:00
@580a388da131
@huijiewei

在 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;
```

问题依然是一样,直接目录不行,完整的文件才可以

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

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

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

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

© 2021 V2EX