我正在尝试使用反向代理访问位于另一台服务器后面的服务器。“主”服务器位于 mydomain.com 后面,我想使用 mydomain.com/test 访问第二台服务器。目前,只有 mydomain.com/test 有效。
但是如果我尝试访问 mydomain.com/test/myfiles,我会被重定向到 mydomain.com/myfiles,但这个网址并不存在,因为这个网址指向“主”服务器,所以会出现 404 not found。我尝试了多种方法,包括 proxy_redirect、rewrite,但都没有用。
server {
listen 80;
index index.php index.html index.htm;
root /path/to/content;
server_name localhost mydomain.com;
location / {
try_files $uri $uri/ =404; #/index.html;
}
location /test/ {
proxy_pass http://192.168.1.202/;
proxy_set_header Host $host;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
curl -I "http://192.168.1.202" -H "Host: mydomain.com"
在主服务器上给出:
HTTP/1.1 301 Moved Permanently
Server: nginx/1.2.1
Date: Sun, 02 Nov 2014 15:02:56 GMT
Content-Type: text/html
Content-Length: 184
Location: example.com/myfiles
Connection: keep-alive
答案1
问题是,当您在proxy_pass
指令中使用尾部斜杠时,默认行为proxy_redirect
如下:
location /test/ {
proxy_pass http://192.168.1.202/;
proxy_set_header Host $host;
}
是相同的 :
location /test/ {
proxy_pass http://192.168.1.202/;
proxy_redirect http://192.168.1.202/ /test/;
proxy_set_header Host $host;
}
因此,给定 curl 输出,您必须进行以下设置:
location /test/ {
proxy_pass http://192.168.1.202/;
proxy_redirect http://$host/ /test/;
proxy_set_header Host $host;
}