我在 nginx 中有一个位置规则,它尝试捕获任何 js、css 和 jpg 文件:
server{
listen 80;
server_name example.com
location ~* \.(js|css|jpg)$ {
root /srv/html;
}
}
这很好用。当我点击时,http://example.com/test.jpg
它会加载我的图像,因此权限是正确的。
不过我想改变这一点,以便只有http://example.com/sub/匹配。
因此,基于这个答案我将位置改为:
location ~* ^/sub/\.(js|css|jpg)$ {
root /srv/html;
}
但此位置似乎不匹配http://example.com/sub/test.jpg
我也尝试过:
location ~* ^/sub/.+\.(js|css|jpg)$ {
root /srv/html;
}
/srv/html/sub/
与位置块匹配,但根据我的错误日志查找文件:
open() "/srv/html/sub/test.jpg" failed (2: No such file or directory)
正确的写法是什么以便我可以:
- 使用权
http://example.com/sub/test.jpg
- nginx 从中检索文件
/srv/html/test.jpg
(也适用于*.jpg
、*.css
和*.js
) - 规则不匹配
http://example.com/test.jpg
答案1
您有一个位于 的文件/srv/html/test.jpg
,并且想要使用 URI 访问它/sub/test.jpg
。
这需要alias
指令,因为不能通过简单地将文档根目录与 URI 连接起来来构建文件的路径。
例如:
location /sub/ {
alias /srv/html/;
}
/
和 值的location
尾随很alias
重要。要么两者都有尾随/
,要么都没有尾随/
。
使用alias
带有正则表达式位置块,要求您捕获 URI 的其余部分并构建语句中的文件的路径alias
。
例如:
location ~* ^/sub(/.+\.(js|css|jpg))$ {
alias /srv/html$1;
}
的顺序正则表达式 location
块很重要。正则表达式按顺序进行评估,因此更具体的正则表达式应该放在不太具体的正则表达式之前。