我是一名 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_name
为subdomain.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
,因为您正在将请求代理到另一台服务器。