Nginx がルートドメインの後の URL 値を受け入れるのはなぜですか?

Nginx がルートドメインの後の URL 値を受け入れるのはなぜですか?

初めて Nginx をセットアップします。目標は、最小限の設定で提供される静的な 'index.html' ページを持つ example.com を作成することです。また、www サブドメインを削除したいと考えています。サイトが利用可能なサーバー ブロックは次のとおりです。

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

www.example.com または example.com を使用すると、www が自動的に削除され、正常に動作します。

問題は、example.com の後に example.com/ABC や example.com/12345 のように何かを入力しても、index.html ページが読み込まれることです。これらのページは存在しないのに、なぜ URL が受け入れられるのでしょうか? ドメイン ルート以外の URL では、代わりに 404 ページが返されるはずです。

これはおそらく非常に単純な問題ですが、ここでもドキュメントでも検索してみましたが、今のところ何も見つかりません。

答え1

これは try_files 句の正しい動作のようです。nginx wiki より:

順番にファイルの存在を確認し、見つかった最初のファイルを返します。末尾のスラッシュはディレクトリ ($uri /) を示します。ファイルが見つからない場合は、最後のパラメータへの内部リダイレクトが呼び出されます。最後のパラメータのみが内部リダイレクトを引き起こし、それより前のパラメータは内部 URI ポインタを設定するだけであることに注意してください。

したがって、見つからない ABC または 12345 を検索すると、index.html への内部リダイレクトが呼び出されます。

次を試してください:

location / {
    try_files $uri $uri/ =404;
}

完全な参考資料については、こちらをご覧ください:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

マーティン・フィヨルドヴァルドのコメント以下は、テスト済みで動作している 2 つのサーバー ブロックの最小構成です。

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;
}

答え2

考えられる2つのこと:

index.htmlへの書き換えルールがあるか

または、index.htmlにリンクされているカスタム404ページがある可能性があります。

少なくとも、それが私が最初に確認する 2 つのアイデアです。

他の解決策としては、ログをチェックし、デバッグ用に値を設定して、index.html に「リダイレクト」するものを確認することが考えられますが、残念ながら、私は nginx について十分に理解していないため、これ以上のサポートはできません。

関連情報