重定向主机头中的相关端口吗?

重定向主机头中的相关端口吗?

我经常使用隧道端口,其中我将通过 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。

相关内容