初めて 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 について十分に理解していないため、これ以上のサポートはできません。