nginx 配置遇到的一个怪事,请教各位 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
keroppi
V2EX    NGINX

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

  •  
  •   keroppi 2020-04-24 16:59:35 +08:00 4161 次点击
    这是一个创建于 2070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给 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; } } 
    30 条回复    2020-05-21 14:53:06 +08:00
    linauror
        1
    linauror  
       2020-04-24 17:17:25 +08:00
    看配置来说,发起和请求的域名不一致应该都会出现跨域的提示,请求具体页面应该也会报错
    keroppi
        2
    keroppi  
    OP
       2020-04-24 17:18:13 +08:00
    @linauror 那为什么填写完整的地址就不报错了呢?
    linauror
        3
    linauror  
       2020-04-24 17:21:37 +08:00
    贴下 network 看看请求
    xxyang
        4
    xxyang  
       2020-04-24 17:25:52 +08:00
    贴下 network 里面的 header
    keroppi
        5
    a href="/member/keroppi" class="dark">keroppi  
    OP
       2020-04-24 17:27:24 +08:00
    ligolas
        6
    ligolas  
       2020-04-24 17:27:54 +08:00
    keroppi
        7
    keroppi  
    OP
       2020-04-24 17:28:41 +08:00
    ligolas
        8
    ligolas  
       2020-04-24 17:30:01 +08:00
    index.php
    这个页面的 header 里面有 cors header
    / 这里会路由到比如你的默认页面,这个里面没有 cors header 吧?
    keroppi
        9
    keroppi  
    OP
       2020-04-24 17:31:58 +08:00
    @ligolas
    / 是直接到 index.php ,而 index.php 有跨域设置的

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

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

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

    问题依然是一样,直接目录不行,完整的文件才可以
    huijiewei
        21
    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
        22
    keroppi  
    OP
       2020-04-24 18:59:06 +08:00
    @huijiewei

    依然不行。。
    keroppi
        23
    keroppi  
    OP
       2020-04-24 18:59:21 +08:00
    @lower http 也是一样的问题
    vindurriel
        24
    vindurriel  
       2020-04-24 19:47:18 +08:00 via iPhone
    fastcgi_param HTTP_HOST your.domain.com;
    canwushuang
        25
    canwushuang  
       2020-04-24 23:56:35 +08:00 via Android
    san.html 里面的问题?
    canwushuang
        26
    canwushuang  
       2020-04-25 00:00:16 +08:00 via Android
    触发了同源策略?
    ligolas
        27
    ligolas  
       2020-04-26 08:59:27 +08:00
    回头看最初的报错,是 prefight 请求的时候没有通过 cors 检查,所以出问题的是 options 请求,不是 post 请求,因为不了解你的网络实际情况,不确定中间还有没有别的 nginx 之类的,所以你先用 postman,发一个 options 请求过去,看看返回的 header 里面的服务器信息,来确定到底是什么服务器回应了这个 options 请求
    ligolas
        28
    ligolas  
       2020-04-27 09:10:44 +08:00
    keroppi
        29
    keroppi  
    OP
       2020-04-29 10:55:20 +08:00
    @ligolas 感谢,我会先测试下,不过没有中间的 nginx 了
    ligolas
        30
    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; 大概率应该可以了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2946 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:47 PVG 21:47 LAX 05:47 JFK 08:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86