Nginx反向代理重写以隐藏应用程序名称

Nginx反向代理重写以隐藏应用程序名称

这个问题可能被问过很多次了,我一直在阅读但仍然无法得到我想要的。

我有一个应用程序正在运行,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.comhttp://sub.domain.com/myapptomcat 索引页。我遗漏了什么?

答案1

当您更改包含 proxy_pass 指令的位置块内正在处理的 URI 的内容时,您需要使用Locationproxy_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;

相关内容