这个问题可能被问过很多次了,我一直在阅读但仍然无法得到我想要的。
我有一个应用程序正在运行,http://172.17.1.10:8080/myapp
我想设置 nginx 反向代理, http://sub.domain.com
仅使用 访问该应用程序,并在地址栏中隐藏“myapp”。
我当前的设置是:
server{
listen 80;
server_name sub.domain.com;
location /myapp {
rewrite ^/myapp(.*) /$1 break;
proxy_pass http://172.17.1.10:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
include /etc/nginx/proxy_params;
}
}
但是我一直使用 查看 Nginx 索引页http://sub.domain.com
和http://sub.domain.com/myapp
tomcat 索引页。我遗漏了什么?
答案1
当您更改包含 proxy_pass 指令的位置块内正在处理的 URI 的内容时,您需要使用Location
proxy_redirect 处理标头重写:
在某些情况下,无法确定要替换的请求 URI 的部分:
当使用正则表达式指定位置时。 在这种情况下,应在不使用 URI 的情况下指定指令。
当使用重写指令在代理位置内更改 URI 时,相同的配置将用于处理请求(中断)。
但是在您的情况下,没有理由使用重写,因为 nginx 在添加 URI 前缀时已经在 proxy_pass 指令中处理了这个问题:
如果 proxy_pass 指令指定了 URI,那么当请求传递给服务器时,规范化请求 URI 中与位置匹配的部分将被指令中指定的 URI 替换。
您还需要删除该proxy_redirect
指令,以便 nginx 可以Location
使用 proxy_pass URI 前缀作为模式并使用位置前缀作为替换来重写标头。
因此只需使用这个:
server {
server_name sub.domain.com;
location / {
proxy_pass http://172.17.1.10:8080/myapp/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
include /etc/nginx/proxy_params;
}
}
答案2
更改这三行应该可以解决问题:
location /myapp {
rewrite ^/myapp(.*) /$1 break;
proxy_pass http://172.17.1.10:8080;
到:
location / {
proxy_pass http://172.17.1.10:8080/myapp;