nginxでフォールバックエラーページを設定する方法


10

現在、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:

私は元のアイデアに非常に近い動作するソリューションを投稿しました。

回答:


10

結局、自分のアイデアにもっと近いものに行き着いた。私が見逃していた鍵が指令であることが判明しましたrecursive_error_pages。私が本当にしなければならなかったのは、これを「オン」にすることだけで、私のオリジナルのアイデアはうまくいきました。これが私のconfの関連部分が今のように見えるものです:

server {
    ...

    root /var/www/someserver.com/;

    error_page 400 404      /404.html;
    error_page 500 502 504  /500.html;
    error_page 503          /503.html;

    recursive_error_pages   on;

    location ~* ^/(404\.html|500\.html|503\.html)$ {
        log_not_found off;
        error_page 404 = @default;
    }

    location @default {
        log_not_found on;
        root /var/www/default;
    }
}

元の質問には含まれていなかった他のエラーの種類をここに含めました。これは、マーティンFのアプローチで問題を引き起こし、他の点では優れていたためです。log_not_foundディレクティブは、単にエラー・ページは、元のルートに見つからない場合、私は私のログに404エラーを取得しないことを保証します。


これはうまく機能します(特に404 / POSTの組み合わせ)が、HTTPエラーコードを飲み込んで200を送信するようです...私と同じように動作しますか?
10

2
代わりに、削除log_not_found off;して追加することができinternal;ます。
Alix Axel

エラーが発生するPOSTリクエストで気づいた問題は、nginxによる奇妙な動作です。trac.nginx.org
Robo

5

try_filesはここに行く方法です。次の構成は機能するはずですが、構文エラーについてはテストしていません。

server {
    ...
    root /var/www;

    location / {
        try_files /someserver.com$uri /default$uri /someserver.com$uri/ /default$uri/ @notfound;
    }

    location @notfound {
       try_files /someserver/404.html /default/404.html =404; # =404 should make it use the nginx-default 404 page.
    }
}

はい、まさにそれが必要でした。私はtry_filesを使用しようとしましたが、あなたの答えは私がそれのために特別な内部の場所を作成する必要があることに気づきました。私はあなたのためにいくつかの微調整を行った私のために働いた構成を示すために私の回答を編集しました。
ジムD

上記の私の編集2を参照してください。私の知る限りでは、この提案はPOSTリクエストでは機能しません。try_filesは元のリクエストのリクエストメソッドを使用するため、405 Not Allowed応答が返されます。
ジムD

@JimD:まあ、このアプローチを正確に使うのではなく、修正したアプローチを使います。これでうまくいきます。Nginxバイナリが0.8.xより古い場合は、アップグレードしてみてください
Martin Fjordvald

さて、問題は私がこれを404秒以上で使用していることです。そのため、現在の場所-> try_files->場所-> try_filesの代わりにerror_page->場所-> try_filesを実行する必要があります。ただし、パッケージの0.7.xバイナリを使用しているので、ソースからビルドして、それが解決するかどうかを確認します。
ジムD

2

残念ながら、私は私の答えで数年遅れていますが、将来の検索に役立つかもしれないと思いました。インストールしたNginxのバージョンは1.2.4で、次の構成スニペットを作成しました。

server {

server_name www.example.com
root /var/www/example


## Errors -> Locations
error_page   400 /400.html;
error_page   403 /403.html;
error_page   404 /404.html;
error_page   500 502 503 504 /50x.html;

## Locations -> Fallback
location = /400.html {
    try_files /400.html @error;
    internal;
}
location = /403.html {
    try_files /403.html @error;
    internal;
}
location = /404.html {
    try_files /404.html @error;
    internal;
}
location = /50x.html {
    try_files /50x.html @error;
    internal;
}

## Fallback Directory
location @error {
    root /var/www/error;
}

}

1
の活用internal
Clint Pachl 2014年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.