85

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

按预期工作

  • http://localhost:8080/test/index.htm: 有效。
  • http://localhost:8080/test/: 有效。

没有按预期工作

  • http://localhost:8080/test: 重定向到http://localhost/test/. 这不是我想要的。(注意它会去除端口号)

我试过的

根据我在谷歌上搜索的内容,我尝试了server_name_in_redirect off;and rewrite ^([^.]*[^/])$ $1/ permanent;,但都没有成功。

我的默认.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

4 回答 4

40

我在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 错误页面。

取自Serverfault 答案

我的更新版本

如果您在server块中添加:

index index.html index.htm;

并修改try_files为如下所示:

try_files $uri $uri/ =404;

它也应该工作。

于 2015-07-02T16:25:20.767 回答
31

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

server {
    listen 80;
    server_name  localhost;
    absolute_redirect off;

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

如果我在 on 上运行 curl http://localhost:8080/foo,我可以看到Location重定向 HTTP 响应中的标头是 as/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 上测试,它工作正常。

于 2018-04-03T20:29:40.790 回答
12

尝试 :

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;
        }
    }
}
于 2014-05-25T19:15:31.823 回答
5

尝试改变

server_name  localhost;
# server_name_in_redirect off;

server_name  localhost:8080;
server_name_in_redirect on;
于 2014-05-02T15:53:30.510 回答