如果浏览器直接访问图像文件,如何重定向用户?

如果浏览器直接访问图像文件,如何重定向用户?

如果用户尝试直接访问浏览器中的图像文件,我该如何重定向?我想保留使用 嵌入图像的功能<img src="...">。如何重定向

https://img.example.com/c/600x1200_90_webp/img-master/img/2022/01/03/08/04/54/95259215_p0_master1200.jpg

https://example.com/detail?id=95259215

这是我的 nginx 配置

location ~ "^/c/600x1200_90_webp/img-master/img/\d+/\d+/\d+/\d+/\d+/\d+/(?<filename>.+\.(jpg|png|webp))$" {
    return 301 https://example.com/detail?id=$filename;
}

代码无法正常工作,因为它会工作,https://example.com/detail?id=95259215_p0_master1200.jpg但我需要它来修剪文件名最后一位数字后的字符串,因此在这种情况下修剪掉_p0_master1200.jpg。如果用户通过浏览器访问它,我也不知道该怎么做。

答案1

正则表达式(?<filename>.+\.(jpg|png|webp))$会将整个文件名捕获到 filename 变量中。若要仅提取_变量之前的部分,请使用以下命令:

(?<filename>[0-9]+).+(?:jpg|png|webp)$

这个只匹配filename变量的数字(我称之为image_id更具描述性)。https://regexr.com是使用正则表达式的好工具。

要限制仅在浏览器上显示,您需要使用nginx http referer 模块

两者结合起来,配置如下:

location ~ "^/c/600x1200_90_webp/img-master/img/\d+/\d+/\d+/\d+/\d+/\d+/(?<filename>[0-9]+).+(?:jpg|png|webp)$" {
    valid_referers server_names;
    if ($invalid_referer = "0") {
        return 301 https://example.com/detail?id=$filename;
    }
}

nginx 将检查 HTTP Referer 值。如果它包含字段中指定的名称server_name,它将发送重定向。referer 字段由浏览器在加载网页资源时设置。

相关内容