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

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

我已經從 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 指令,如果本機檔案存在於一個(或多個)本機目錄中,則該指令提供本機檔案的內容。當未找到檔案時,將進行內部重定向到最後一個參數中指定的 uri。

由於它無法從外部重定向,因此您需要一些技巧和兩層方法。在 try_files 選項中,您使用指定位置進行內部重定向,並從該指定位置建構外部重定向。

location / {
    try_files  $uri  @externalbackup;
}

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

上面的程式碼未經測試。

相關內容