我有以下位置处理我的资产:
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
和完成它。