我从一个客户那里继承了一个网络项目,该客户将一堆图像和 PDF 文件放在其网站的根目录中,以便他们可以轻松地将这些图像/文件的链接发送给他们的客户。
将网站移至新服务器,因此之前设置的链接仍需工作,但我希望稍微清理一下。根目录中有数百个这样的文件松散地存在。
理想情况下,我希望将所有松散的图像/文件移动到一个目录(暂时称之为“东西”),然后编写一个 Nginx 指令进行重定向。
像这样:
location = / {
location ~* \.(gif|jpg|jpeg|pdf)$ {
rewrite ^(.*) https://example.com/stuff/$1 last;
}
}
但显然 Nginx 不允许在完全匹配块内嵌套位置块。
是否可以仅在根目录中找到某些文件类型(通过扩展名)?
如果这很明显,请原谅我。这有点超出我的能力范围。任何帮助都将不胜感激。
答案1
您的两个位置块直接冲突。location = /
仅匹配对https://www.example.com/
URL 的请求,不匹配其他任何请求。这意味着与嵌套location
指令匹配的请求永远不会进入该块。
但是,下面的方法应该可行:
location ~* ^/[^/]+\.(?:gif|jpg|jpeg|pdf)$ {
root /var/www/stuff;
try_files $uri =404;
}
这里不需要嵌套位置。
这个配置的意思是,对于根目录中具有特定扩展名的文件,我们将为该文件提供服务的根目录设置为/var/www/stuff
,然后尝试使用 发送该文件try_files
。如果找不到文件,则发送 404 错误。
正?:
则表达式中的匹配是可选的,它只是一个轻微的优化,告诉 nginx 不要将括号内的值捕获到局部变量中。