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

4 に答える 4

40

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

私が質問を正しく理解している場合、リクエストが http://example.com/foo に対するもの末尾にスラッシュがない場合、301 リダイレクトを使用せずに http://example.com/foo/index.html を自動的に処理する必要があります ?

私のために働く基本的な解決策

もしそうなら、私はこの try_files 構成が機能することを発見しました:

try_files $uri $uri/index.html $uri/ =404;
  • 最初$uriのものは uri と正確に一致します
  • 2 番目$uri/index.htmlは、パスの最後の要素がディレクトリ名と一致し、末尾にスラッシュがない index.html を含むディレクトリと一致します。
  • 3番目$uri/はディレクトリに一致します
  • 4 番目=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/;
    }

curl on on を実行すると、リダイレクト HTTP 応答のヘッダーが ではなくとして指定されhttp://localhost:8080/fooていることがわかります。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/

そのことから、どの Web ブラウザーも相対位置を正しく処理すると思います。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 に答える