Nginx的导致301重定向如果没有尾随斜线(Nginx causes 301 redirect i

2019-07-22 11:00发布

我使用NAT在虚拟机中运行nginx的,我有重定向问题,当我从主机访问它。

按预期工作

  • http://localhost:8080/test/index.htm作品:。
  • http://localhost:8080/test/ :作品。

不能按预期工作

  • http://localhost:8080/test :重定向到http://localhost/test/ 。 这不是我想要的。

我已经试过

根据我GOOGLE了,我试过server_name_in_redirect off;rewrite ^([^.]*[^/])$ $1/ permanent; ,都没有成功。

我default.conf:

server {
    listen       80;
    server_name  localhost;
    # server_name_in_redirect off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
    # rewrite ^([^.]*[^/])$ $1/ permanent;
        root           /usr/share/nginx/html;
        try_files      $uri =404;
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass   unix:/tmp/php5-fpm.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

Answer 1:

我贴一个可能的解决方案在这个问题上serverfault ; 这里转载出于方便:

如果我理解正确的问题,你想自动服务,而无需使用301重定向, http://example.com/foo/index.html当请求是http://example.com/foo没有尾随斜线?

这对我的作品,基本解决方案

如果是这样,我发现这个try_files配置工作:

try_files $uri $uri/index.html $uri/ =404;
  • 第一$uri完全匹配的URI
  • 第二$uri/index.html匹配包含在路径的最后一个元素的目录名称相匹配的index.html的目录,没有尾随斜线
  • 第三$uri/匹配的目录
  • 第四=404如果返回404错误页面没有前述图案匹配的。

我的更新版本

如果在添加server块:

index index.html index.htm;

并修改try_files看起来像这样:

try_files $uri $uri/ =404;

它应该工作了。



Answer 2:

尝试:

server {
    listen       80;
    server_name  localhost;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
        if (-d $request_filename) {
            rewrite [^/]$ $scheme://$http_host$uri/ permanent;
        }
    }
}


Answer 3:

一个稍微简单的解决方案,为我工作,就是禁用绝对重定向absolute_redirect off; 如下面的例子:

server {
    listen 80;
    server_name  localhost;
    absolute_redirect off;

    location /foo/ {
        proxy_pass http://bar/;
    }

如果我跑卷曲上http://localhost:8080/foo ,我可以看到Location在重定向HTTP响应头给出/foo/ ,而不是http://localhost/foo/

$ curl -I http://localhost:8080/foo
HTTP/1.1 301 Moved Permanently
Server: nginx/1.13.8
Date: Tue, 03 Apr 2018 20:13:28 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: /foo/

从这一点,我认为任何Web浏览器会做正确的事与相对位置。 测试在Chrome和它工作正常。



Answer 4:

试着改变

server_name  localhost;
# server_name_in_redirect off;

server_name  localhost:8080;
server_name_in_redirect on;


文章来源: Nginx causes 301 redirect if there's no trailing slash