如果没有尾部斜杠,Nginx会导致301重定向

时间:2013-03-21 18:33:46

标签: url redirect nginx

我正在使用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;
    }

}

4 个答案:

答案 0 :(得分:16)

我在serverfault上发布了此问题的可能解决方案;为方便起见,转载于此处:

如果我正确理解了这个问题,那么当您的请求是http://example.com/foo/index.html且没有斜杠时,您希望自动投放,而不使用301重定向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;

它也应该有用。

答案 1 :(得分:10)

尝试:

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;
        }
    }
}

答案 2 :(得分:9)

一个稍微简单的解决方案,对我有用,是禁用absolute_redirect off;的绝对重定向,如下例所示:

server {
    listen 80;
    server_name  localhost;
    absolute_redirect off;

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

如果我在http://localhost:8080/foo上运行curl,我可以看到重定向HTTP响应中的Location标头是/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/

由此,我假设任何网络浏览器都会使用相对位置做正确的事情。在Chrome上测试过,它运行正常。

答案 3 :(得分:5)

尝试更改

server_name  localhost;
# server_name_in_redirect off;

server_name  localhost:8080;
server_name_in_redirect on;