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]
私が試したこと
- 既存のソリューションを検索しましたが、機能するソリューションは見つかりませんでした。
- コンバーターを使用して 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 ;
}
上記のコードはテストされていません。