web-dev-qa-db-ja.com

末尾のスラッシュがない場合、nginxは301リダイレクトを引き起こします

NATを使用して仮想マシンでnginxを実行しています。ホストマシンからアクセスすると、リダイレクトの問題が発生します。

期待通りに動作します

  • _http://localhost:8080/test/index.htm_:動作します。
  • _http://localhost:8080/test/_:動作します。

期待どおりに動作しません

  • _http://localhost:8080/test_:_http://localhost/test/_にリダイレクトします。これはnot欲しいものです。

私が試したこと

私がグーグルで調べたことに基づいて、私は_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;
    }

}
_
44

serverfault ;にこの問題の可能な解決策を投稿しました。便宜上、ここに複製します。

質問を正しく理解している場合、301リダイレクトを使用せずに、 http://example.com/foo/index.htmlhttp: //example.com/foo スラッシュなし?

私のために働く基本的なソリューション

もしそうなら、このtry_files設定が機能することがわかりました:

try_files $uri $uri/index.html $uri/ =404;
  • 最初 $uriはURIと完全に一致します
  • 二番目 $uri/index.htmlは、パスの最後の要素がディレクトリ名に一致するindex.htmlを含むディレクトリに一致します。末尾にスラッシュは付きません。
  • 第3 $uri/はディレクトリと一致します
  • 第4 =404は、前述のパターンのいずれも一致しない場合に404​​エラーページを返します。

更新されたバージョン

serverブロックに追加する場合:

index index.html index.htm;

そして、try_files次のようになります。

try_files $uri $uri/ =404;

それも動作するはずです。

19
John Weldon

私のために働いたやや単純な解決策は、次の例のように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でテストされ、正常に動作します。

12
guiccbr

試してください:

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

変更してみてください

server_name  localhost;
# server_name_in_redirect off;

server_name  localhost:8080;
server_name_in_redirect on;
5
Dave Turner