如何正确回退图像?

我有以下位置处理我的资产:

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 

我应该如何改变我的位置?

首先,不要使用root指令来做到这一点。 alias是正确的指令。 root仅用于完整的服务器块。

如果nginx应该检查另一个目录,以防文件不在第一个目录中,你可以使用try_files 。 如果不是这种情况,则必须find可应用正则expression式的重复模式。

那么在这一点上出现了一个问题。 如果我们想使用try_files我们不能使用alias因为长期存在的bug 。 对于你的具体用例,我们将回到使用root指令,因为否则我们不能实现它。

最后但并非最不重要的, 梅尔文是正确的。 你应该纠正你的文件系统。 使用旧链接的正则expression式,并使用301redirect到新的位置。

基于你的问题的例子

 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; } } } 

你的例子是不正确的。

 location ~ \.(?css|js|jpe?g|png) { root /var/static; } 

请求www.example.com/img/file.png将从/var/static/img/file.png

如果从/var/static/css获取/img/file.png的请求,那么在你的站点中的其他问题是错误的,最后,你应该把图片移动到正确的目录,而不是使用正则expression式来解决命名约定的偏差,或者只是做一个目录/var/static/media和完成它。