请教关于 NGINX 反代的问题

2022-04-08 11:36:53 +08:00
 luxu

想通过 http://aaa/ceshi 访问到 http://bbb 的内容, 但是代理后一些 js ,css 文件报 404,发现是缺少前缀的问题。请问 a 机器上怎么配置? 谢谢大家

a 机器配置

        location ^~/ceshi/ {
                proxy_set_header Host $host;
                proxy_set_header  X-Real-IP        $remote_addr;
                proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_set_header X-NginX-Proxy true;
                proxy_pass http://192.168.0.50;
        		}

b 机器配置

        location ^~/ceshi/ {
        proxy_set_header Host $host;
        proxy_set_header  X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://localhost/;
    	}

b 机器日志

[08/Apr/2022:11:22:46 +0800] "GET / HTTP/1.0" 127.0.0.1 - -200 26867  "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36" "192.168.21.233, 192.168.0.53"

浏览器 Console

:81/js/chunk-f0487752.5a2a9024.js:1          Failed to load resource: the server responded with a status of 404 (Not Found)
:81/js/chunk-f5dfb222.b4892263.js:1          Failed to load resource: the server responded with a status of 404 (Not Found)
:81/js/chunk-f46a5f00.d5bf17fb.js:1          Failed to load resource: the server responded with a status of 404 (Not Found)
:81/js/chunk-fc9277e6.a8e8a87f.js:1          Failed to load resource: the server responded with a status of 404 (Not Found)
:81/js/chunk-ffb40534.0d082972.js:1          Failed to load resource: the server responded with a status of 404 (Not Found)
iview.css:1          Failed to load resource: the server responded with a status of 404 (Not Found)
gitalk.css:1          Failed to load resource: the server responded with a status of 404 (Not Found)
quill.snow.css:1          
2508 次点击
所在节点    NGINX
7 条回复
julyclyde
2022-04-08 12:31:08 +08:00
skiy
2022-04-08 12:41:11 +08:00
原因是因为你网站请求的静态资源(前缀)不包含 /ceshi/ ,所以它没进代理里面。

你还需要另外再设置一个 (.css | .js ) 的伪静态。
adoal
2022-04-08 12:54:23 +08:00
因为后端的应用并不具备“意识到自己有可能运行在前缀路径下”的能力,所以动态页面里生成的静态资源链接还是按照自己运行在根路径下的。
要解决这个问题,要么改造后端程序加入这种探测能力。要么(不一定能 100%完美准确判定)在 nginx 里加入改写规则,对后端返回的页面里静态资源的绝对路径做改写加上前缀。
adoal
2022-04-08 13:04:49 +08:00
比如说用 Python Flask 写的可以参照这个例子 https://gist.github.com/jrialland/bf017843bbead538c20c382a19d880fe
其它语言和框架应该有类似 trick
rekulas
2022-04-08 13:10:03 +08:00
<base>标签强制制定下根路径试试
如果还不行只能改造输出代码了,没有 100%完美解决方案
luxu
2022-04-08 14:13:24 +08:00
@julyclyde 感谢回复,我试一下

@skiy 感谢,不可以用这种方法 :(

@adoal 对,就想发帖问下如果改写可以的话如何改写

@rekulas 谢谢,我试一下
wolfmei
2022-04-10 21:47:02 +08:00
试下 location /ceshi {proxy_pass http://192.168.0.50;}
如果不行,可以加个 proxy_redirect 试下

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

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

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

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

© 2021 V2EX