ファイルが見つからない場合は他のサーバーとドメインにリダイレクトします

ファイルが見つからない場合は他のサーバーとドメインにリダイレクトします

Apache から Nginx に移行したので、すべてのルールを Nginx で設定したいと考えています。

ゴール:要求されたサーバー上にファイルが見つからない場合、URL を同じファイル名を持つ別のドメインにリダイレクトします。

ユーザーがhttps://www.example.com/data/1.jpg私のサーバーは「data」ディレクトリで「1.jpg」を探します。そのファイルが見つからない場合は、ユーザーをバックアップサーバーのURLにリダイレクトします。https://www.example2.com/backup/1.jpg

.htaccess の例

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (.*) - [L]
RewriteRule (.*) https://example2.com/backup/$1 [L]

私が試したこと

  1. 既存のソリューションを検索しましたが、機能するソリューションは見つかりませんでした。
  2. コンバーターを使用して Apache 構成を Nginx 構成に変換しようとしましたが、機能しません。

いくつかは設定を試みましたが、機能しませんでした。

    location ~ /data/.* {
        if (-e $request_filename){
            rewrite ^ https://www.example2.com/backup/$1 last;
        } 
    }


    location ~ /data/.* {
        if (-e $request_filename){
            rewrite ^ https://www.example2.com/backup/$1 permanent;
        } 
    }


    location ~ /data/.* {
        try_files $uri https://www.example2.com/backup/$uri;
    }

答え1

@Rob の回答を修正した後、解決策を得ました。

set $v_filename nf;

location ~ ^/data/(.*)$ {
    try_files  $uri  @externalbackup;
    set $v_filename $1;
}

location @externalbackup {
     return 301  https://www.example2.com/backup/$v_filename ;
}

答え2

nginxでは、try_files ディレクティブは、ローカル ファイルが 1 つ (または複数) のローカル ディレクトリに存在する場合に、ローカル ファイルからコンテンツを提供します。ファイルが見つからない場合は、最後のパラメータで指定された uri への内部リダイレクトが行われます。

外部にリダイレクトできないため、少し工夫して 2 層のアプローチが必要になります。try_files オプションでは、内部リダイレクトに名前付きの場所を使用し、その名前付きの場所から外部リダイレクトを構築します。

location / {
    try_files  $uri  @externalbackup;
}

location @externalbackup {
     return 301  https://www.example2.com/backup$request_uri ;
}

上記のコードはテストされていません。

関連情報