nginx が「301 を返す」と「try_files」が無限ループに陥る理由

nginx が「301 を返す」と「try_files」が無限ループに陥る理由

私の設定コード:

index index.html index.php;
location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/ =404; 
}

url が の場合/a/、 に 301 して/a、 のtry_files部分を末尾/に追加して にします。/a/a/

index次のステップでは、定義を試して、 になり/a/index.html、ファイルに到達すると思います。

しかし、実際には、 を試みて/a/から飛び出しlocation、再び に入りlocation、 になりますif ($uri = '/a/') { ... }

そして無限ループ。

ああ、混乱しちゃっただけ。


私がやりたいのは

  1. 要求された場合はexample.com/a/にジャンプしexample.com/a、次に 2 に進みます。
  2. リクエスト の場合はexample.com/a表示しますexample.com/a/index.html(ただし URL は ですexample.com/a)。

これを達成するのに誰か助けてくれませんか?

答え1

まさに意図したとおりの動作をしています。

/a/index.htmlこれが起こる前ににリダイレクトし続けるため、 に到達することはできません/a。nginx がこれを処理すると、ファイルシステム上のディレクトリが認識され、 に (正しく) 自動的にリダイレクトされます/a/

この不適切なリダイレクトを削除する必要があります。

答え2

ServerFault へようこそ。次のコードを使用して、OP に記載されている操作を実行できます...

location / {
    if ($uri = '/a/') {
        return 301 https://example.com/a;
    }
    try_files $uri $uri/index.html =404; 
}

関連する質問と承認された回答については、nginx で URL から末尾のスラッシュを削除する

基本的には、頼る必要はなくindex、要求されたindex.htmlときに直接サービスを提供しますexample.com/a

関連情報