我需要为 Nginx 编写一个重写规则,以便当用户尝试访问旧的图像 URL 时:
/图像/路径/到/图像.png
并且该文件不存在,请尝试重定向到:
/website_images/path/to/image.png
仅当图像存在于新 URL 中时,否则继续 404。我们主机上的 Nginx 版本还没有 try_files。
答案1
location /images/ {
if (-f $request_filename) {
break;
}
rewrite ^/images/(.*) /new_images/$1 permanent;
}
不过,您可能想要催促您的主机升级或寻找更好的主机。
答案2
请不要if
在位置块内使用。可能会发生不好的事情。
location ~* ^/images/(.+)$ {
root /www;
try_files /path/to/$1 /website_images/path_to/$1 /any/dir/$1 @your404;
}
$1
成为 try_files 指令中尝试的文件名,该指令是为了您要完成的任务而制作的。
或者,不检查就重写。如果该图像不存在,你无论如何都会得到 404。老实说,如果你没有try_files
,解决方案可能是将 nginx 升级到最新的稳定分支。
答案3
您可以使用类似这样的方法(尚未针对您的具体情况进行测试):
location ^/images/(?<imgpath>.*)$ {
set $no_old 0;
set $yes_new 0;
if (!-f $request_filename)
{
set $no_old 1;
}
if (-f ~* "^/new_path/$imgpath")
{
set $yes_new 1$no_old;
}
# replacement exists in the new path
if ($yes_new = 11)
{
rewrite ^/images/(.*)$ /new_path/$1 permanent;
}
# no image in the new path!
if ($yes_new = 01)
{
return 404;
}
}
这基本上是编写嵌套if
语句的另一种方式,因为您无法在 Nginx 中嵌套。请参阅这里作为这次“黑客攻击”的官方参考。