如果用户尝试直接访问浏览器中的图像文件,我该如何重定向?我想保留使用 嵌入图像的功能<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 字段由浏览器在加载网页资源时设置。