如何使用 Nginx 重写和 proxy_pass 同时保留用户输入的 URL

如何使用 Nginx 重写和 proxy_pass 同时保留用户输入的 URL

我是一名 Nginx 初级用户,正在尝试代理以下内容:

http://subdomain.example.com/mypage/login
TO
http://some_ip_address/login

(不仅仅是 /login – 该网站还有其他上下文,例如 /static、/api 等)

尽管我可以从功能上实现这一点,但用户会http://some_ip_address在他们的浏览器中看到这种情况,这是我想要避免的。

该配置如下所示:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;
    keepalive_timeout  3;
    server {
        server_name this_server_ip;
        location /mypage/ {
            proxy_pass http://some_ip_address;
            rewrite ^/mypage/(.*)$ http://some_ip_address/$1 last;
        }
        location / {
          root /var/local/directory/;
        }
    }
}

为了修复此问题,我尝试了以下组合:

  • proxy_pass http://some_ip_address/;(即带有尾部斜杠)
  • proxy_set_header Host $host;
  • rewrite ^/mypage/(.*)$ /$1 last;

但是我要么得到 404 错误,要么提供托管在 的页面http://subdomain.example.com,即rewrite可以工作但proxy_pass不能。

serverfault 上有几个类似的问题,但不幸的是,没有一个能解决我遇到的这个问题。例如这个那个

如有任何建议,我们将不胜感激,谢谢。

答案1

您正在指定this_server_ip此虚拟主机的主机名。这意味着此虚拟主机不用于任何具有域名的请求,但您的 nginx 默认虚拟服务器用于请求http://subdomain.example.com/

您需要将您的更改server_namesubdomain.example.com,或添加default_server到此块listen上的指令server并将其从 nginx 默认配置中删除。

编辑:尝试这个虚拟主机配置:

server {
    server_name subdomain.example.com;
    location ~ /(mypage|static/api)/ {
        proxy_pass http://some_ip_address/$1/;
    }
    location / {
      root /var/local/directory/;
    }
}

也就是说,您根本不需要语句rewrite,因为您正在将请求代理到另一台服务器。

相关内容