Nginxは、ファイルが存在する場合にのみURLを書き換えます


13

ユーザーが古い画像のURLにアクセスしようとすると、Nginxの書き換えルールを記述する必要があります。

/images/path/to/image.png

ファイルが存在しない場合は、次の場所にリダイレクトしてください:

/website_images/path/to/image.png

新しいURLに画像が存在する場合のみ、それ以外の場合は404に進みます。ホスト上のNginxのバージョンには、try_filesがまだありません。

回答:


19
location /images/ {
    if (-f $request_filename) {
        break;
    }

    rewrite ^/images/(.*) /new_images/$1 permanent;
}

ただし、アップグレードするか、より良いホストを見つけるためにホストをバグにすることができます。


これにより、すべての404の権利で/ new_imagesにリダイレクトされますか?new_imagesファイルが存在することがわかっていない限り、書き換えを行いたくありません
ホセフェルナンデス

これは、ファイルが存在するかどうかを確認し、そのテストが失敗した場合、new_imagesにリダイレクトします。その後に何が起こるかは、ここでは指定されていません。
タイラー

私はあなたのオプションはnginxの著者によって一般的な落とし穴として考慮されることを恐れているnginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/...
riverfall

2
@riverfallへー、私はそのページの一部を書きました。私の答えは8年前に書かれたので、それは少し古いですが、元の質問は具体的には、ホストがnginxの最新バージョンを提供していないため、try_filesにアクセスできないと述べていました。
マーティンフィヨルドヴァルド

1
@ Guillaume86心配する必要はありません。if+書き換えは完全に安全であり、ファイルに対する1回のSTATチェックは非常に軽量です。バックエンドアプリケーションに行ってメンテナンスモードをチェックするよりもはるかに高速です。
マーティンフィヨルドヴァルド

6

ifロケーションブロック内では使用しないでください。悪いことが起こるかもしれません。

location ~* ^/images/(.+)$ {
    root /www;
    try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}

$1 try_filesディレクティブで試行するファイル名になります。これは、目的の内容に合わせて作成されます。

これ、または、チェックせずに書き換えます。そのイメージが存在しない場合は、とにかく404が表示されます。


この回答は厳密には質問に回答していませんが(「[no] try_filesyet」)、将来ここに来る訪問者にとっては、この回答はより多くの賛成に値します。
DerMike

5

次のようなものを使用できます(特定のケースではテストされていません):

location ^/images/(?<imgpath>.*)$ {

    set $no_old  0;
    set $yes_new 0;

    if (!-f $request_filename)
    {
        set $no_old 1;
    }

    if (-f ~* "^/new_path/$imgpath")
    {
        set $yes_new 1$no_old;
    }

    # replacement exists in the new path
    if ($yes_new = 11)
    {
        rewrite ^/images/(.*)$ /new_path/$1 permanent;
    }

    # no image in the new path!
    if ($yes_new = 01)
    {
        return 404;
    }
}

ifNginxではネストできないため、これは基本的にネストされたステートメントを記述する代替方法です。この「ハック」の公式リファレンスについては、こちらをご覧ください。

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