現在、nginxがいくつかのエラーページと他の「デフォルト」メディアファイル(favicon.icoやrobots.txtなど)を処理するように構成しています。 。
基本的に、私がやろうとしていることは、そのサーバーのルートの下にあるサーバーに特定のファイルを提供することです(例:/var/www/someserver.com/robots.txt)。そのファイルが存在しない場合は、nginxを「デフォルト」、つまり/var/www/default/robots.txtに移動します。これは、(正常に)構成した方法の基本的な要点です。
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
それはうまくいきます。
エラーページに対しても同じことを実行しようとしていますが、それを実行することはできません。
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
これは、someserver.com / 404.htmlにアクセスした場合、最初に/var/www/someserver.com/404.htmlをロードしてから、/ var / www / defaultにフォールバックするという意味で「機能する」ことに注意してください。 /404.html見つからない場合。ただし、someserver.com / blahblahにアクセスした場合、404ページは/var/www/someserver.com/で設定されている場合にのみ表示されます。そのファイルが存在しない場合、デフォルトのディレクトリにフォールバックしません。
とにかく、あなたはおそらく私が達成しようとしていたことをすることができます(それが私が最初の実用的な例を含めた理由です)。
何か案は?
編集:
マーティンFの答えに基づいて、これは私がまとめたものです:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
これは素晴らしい作品です。上記のerror_pagesと場所の実際のブロックは、すべての仮想ホストに含まれるserver_defaults.confファイルにあります。そのため、各場所へのパスをハードコーディングせず、デフォルトの相対パスを使用しました。
編集2:
このアプローチには問題があります。エラーを返すURLにPOSTすると、POSTリクエストメソッドがtry_files試行とともに送信されます。これは(私にとっては)405 Not Allowedエラーになります。nginxは基本的に、そのページを取得するのではなく、たとえば/default/500.htmlにPOSTしようとしているためです。
編集3:
私は元のアイデアに非常に近い動作するソリューションを投稿しました。