web-dev-qa-db-ja.com

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

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

/images/path/to/image.png

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

/website_images/path/to/image.png

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

13
Jose Fernandez
location /images/ {
    if (-f $request_filename) {
        break;
    }

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

ただし、アップグレードするか、より良いホストを見つけるために、ホストにバグを追加したい場合があります。

19

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

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

$1は、try_filesディレクティブで試行するファイル名になります。これは、達成しようとしている目的のために作成されます。

これ、または、チェックせずに書き換えるだけです。その画像がそこになければ、とにかく404を取得します。

6
Garet Claborn

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

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;
    }
}

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

5
tmslnz