我已经从 Apache 迁移到 Nginx,所以我想在 Nginx 中设置所有规则。
目标:如果在请求的服务器上找不到该文件,则将 URL 重定向到具有相同文件名的另一个域。
例子
如果用户打开https://www.example.com/data/1.jpg然后我的服务器将尝试在“数据”目录中查找“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
指令,如果本地文件存在于一个(或多个)本地目录中,则提供来自本地文件的内容。如果未找到文件,则进行内部重定向到最后一个参数中指定的 uri。
由于无法进行外部重定向,因此您需要一些小技巧和两层方法。在 try_files 选项中,您使用命名位置进行内部重定向,并从该命名位置构建外部重定向。
location / {
try_files $uri @externalbackup;
}
location @externalbackup {
return 301 https://www.example2.com/backup$request_uri ;
}
上述代码尚未测试。