如果找不到文件则重定向到其他服务器和域

如果找不到文件则重定向到其他服务器和域

我已经从 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]

我尝试过

  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 ;
}

上述代码尚未测试。

相关内容