Nginx

如果找不到文件,則重定向到其他伺服器和域

  • April 29, 2022

我已經從 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;
   }

修改@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 ;
}

在 nginx 中,您將使用一個try_files 指令,該指令從本地文件中提供內容,如果它存在於一個(或多個)本地目錄中。當沒有找到文件時,內部重定向到最後一個參數中指定的 uri。

由於這不能從外部重定向,因此您需要一些技巧和兩層方法。在 try_files 選項中,您使用命名位置進行內部重定向,並從該命名位置構造外部重定向。

location / {
   try_files  $uri  @externalbackup;
}

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

上面的程式碼未經測試。

引用自:https://serverfault.com/questions/1099771