如何构建 nginx 位置通配符以匹配 /sub/test.jpg 但不匹配 /test.jpg

如何构建 nginx 位置通配符以匹配 /sub/test.jpg 但不匹配 /test.jpg

我在 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块很重要。正则表达式按顺序进行评估,因此更具体的正则表达式应该放在不太具体的正则表达式之前。

这个文件针对该alias指令,以及这个文件location指令。

相关内容