我有一个应用程序,其前端用 Angular 编写在服务器 1 上,可通过 apache 在本地网络中访问(通过端口 81 上的 ip 访问:http://192.168.123.123:81)。
现在,由于各种原因,我必须使用服务器 1 上的 nginx 反向代理该站点。
如果我在“location /”处创建代理,则一切都将正常运行:
listen 80;
server_name example.com;
location / {
proxy_pass http://192.168.123.123:81/;
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-Forwarded-Proto $scheme;
}
事实是,我必须该网站位于 example.com/foo,因此我只需更改位置:
location /foo/ {
proxy_pass http://192.168.123.123:81/;
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-Forwarded-Proto $scheme;
}
不起作用。这样做后,浏览器中会出现一个空白页,每个 js 文件都会出现 404。然后我读到 nginx 在使用变量时对位置指令的处理方式不同,所以我搜索了解决方案。我找到的唯一方法是使用重写从发送到其他服务器的 uri 中删除“foo”:
rewrite ^/foo(.*)$ $1 break;
再次,它不起作用。我还尝试使用位置、重写和 proxy_pass url 中的斜杠,但没有成功。
我真的不知道该尝试什么了。请忍耐一下,我还是个初学者。
答案1
经过更多的反复试验后,我发现,不管怎样,我的应用程序不喜欢 nginx 通过代理发送请求的方式,并且对各种 js 文件和我的资产文件夹的确切位置感到困惑。
location /foo/
我通过使用内部子过滤器来更改 index.html 中的 href 来解决该问题:
sub_filter 'href="/' 'href="/foo/';
sub_filter_once off;
另外,我添加了一个位置块,对资产文件夹执行另一个反向代理:
location /foo/ {
proxy_pass http://192.168.123.123:81/assets/;
}
虽然从技术上讲这可行,但我真的不喜欢这个解决方案。因此,为了简单起见,我最终决定只使用子域名 (foo.example.com),并避免使用更多“黑客”解决方案。不过,我会看看有关使用 nginx 作为缓存反向代理的帖子。这看起来很有趣。