我经常使用隧道端口,其中我将通过 SSH 将远程端口 80 转发到本地端口 8080。
我遇到的一个有趣的问题是,当我在 NGINX 中有这样的规则时:
rewrite ^/(.+)/$ /$1 permanent;
重写将接受如下请求:
curl -is -X GET http://localhost:8080/one/two/three/
并将其重定向到如下 URL:
http://localhost/one/two/three
它从主机头中删除端口,并将我重定向到未绑定的端口 80,并且会破坏一切。
我可以配置 NGINX 以在进行重定向时尊重主机端口(如 Host 标头中所示)吗?
从请求标头可以看出,Host 标头包含端口,我希望 NGINX 对所有重定向使用此值来维护客户端用于访问服务器的原始端口。
我的 NGINX 站点配置如下:
server {
listen *:80;
server_name _;
index index.html index.htm;
access_log /var/log/nginx/default.access.log combined;
error_log /var/log/nginx/default.error.log;
location / {
root /vagrant/_site;
index index.html index.htm index.php;
try_files $uri $uri.html $uri/ =404;
}
port_in_redirect on;
server_name_in_redirect off;
}
复现的具体步骤如下:
$ curl -is http://localhost:8080/2015/08/from-hell-flying-united-airlines
HTTP/1.1 301 Moved Permanently
Server: nginx/1.8.0
Date: Wed, 02 Sep 2015 19:43:10 GMT
Content-Type: text/html
Content-Length: 184
Location: http://localhost/2015/08/from-hell-flying-united-airlines/
Connection: keep-alive
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.8.0</center>
</body>
</html>
我不确定为什么它首先要重定向以附加斜线,但重定向破坏了一切。
答案1
我以一种有趣的方式解决了这个问题,但对我来说,这种方式并没有立即产生意义。这似乎try_files
把事情搞乱了,所以我对我的配置进行了以下操作,以使一切正常:
server {
listen *:80;
server_name _;
port_in_redirect on;
server_name_in_redirect off;
index index.html index.htm index.php;
access_log /var/log/nginx/default.access.log combined;
error_log /var/log/nginx/default.error.log;
location / {
rewrite ^/(.+)/+$ $scheme://$http_host/$1 permanent;
root /vagrant/_site;
index index.html index.htm index.php;
try_files $uri $uri/index.html $uri/ =404;
}
}
我的目标,即使不是立即明确的,是让帖子不以斜线结尾。
我实际提供的目录结构如下:
/vagrant/_site/2015/
`-- 08
`-- from-hell-flying-united-airlines
`-- index.html
因此,我告诉 NGINX,对于每个请求,我希望它尝试在 、 和 处定位文件$uri
。$uri/index.html
如果$uri/
这些方法都不起作用,则返回 404。