我有以下位置来处理我的资产:
location ~ \.(?:css|js|jpe?g|png) {
root /var/static;
}
因此如果请求
www.example.com/img/file.png
file.png 将从中获取
/var/static/css/file.png
是的。但在某些情况下,我需要处理以下请求:
www.example.com/css/file1.png
并从 img 目录中获取
/var/static/img/file1.png
我应该如何更改我的位置?
答案1
首先,不要使用root
指令来执行此操作。alias
是正确的指令。root
仅适用于完整的服务器块。
try_files
如果文件不在第一个目录中,您可以使用if nginx 应该检查其他目录。如果不是这种情况,您必须找到可以应用正则表达式的重复模式。
好了,这时就出现了一个问题。如果我们想使用,try_files
我们不能使用,alias
因为一个长期存在的错误。对于您的特定用例,我们将重新使用root
指令,因为否则我们无法实现它。
最后但并非最不重要,梅尔文是正确的。您应该更正文件系统。对旧链接使用正则表达式,并使用 301 将其重定向到新位置。
根据你的问题举个例子
server {
listen 80;
server_name _;
root /var/www;
location / {
location ~* ^/[^/]*/(.*)\.(css|js|jpe?g|png)$ {
root /var/static;
try_files $uri /img/$1.$2 =404;
}
}
}
答案2
你的例子根本不正确。
location ~ \.(?css|js|jpe?g|png) {
root /var/static;
}
并且将从 中获取请求 www.example.com/img/file.png /var/static/img/file.png
。
后面的问号(
也不该放在那里。如果 的请求/img/file.png
来自 ,那么您的网站肯定存在其他问题。/var/static/css
最后,您确实应该将图像移动到正确的目录中,而不是使用正则表达式来修复命名约定的偏差。或者直接创建一个目录/var/static/media
,然后就完事了。