Nginx
如果找不到文件,則重定向到其他伺服器和域
我已經從 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; }
修改@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 ; }
上面的程式碼未經測試。