![使用 Nginx 从两个不同的目录提供图像](https://linux22.com/image/678718/%E4%BD%BF%E7%94%A8%20Nginx%20%E4%BB%8E%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84%E7%9B%AE%E5%BD%95%E6%8F%90%E4%BE%9B%E5%9B%BE%E5%83%8F.png)
这应该是基础的...我是新手,无论用多少谷歌搜索和搜索堆栈交换都无济于事。
我有一个网站,希望能够提供来自不同目录的图片。我认为最简单的方法是将 website.com/i/image.jpg 之类的内容映射到 root/i/ 下的文件夹,然后将图片放入其中,然后就完成了。所以这样的方法应该可行,不是吗?
location /i/ {
/i/$uri;}
我不知道,我真的很难理解 nginx 语法。但我也想让 URL 尽可能短,我相信我可以用正则表达式做一些奇特的逻辑,这样我就可以从 /i/ 调用图像,而不会弄乱从根目录或其他文件夹调用的图像。但我对语法感到困惑。
我在 stackexchange 上看到一些其他帖子,人们试图捕获一个字符串,我意识到如果我让所有图像的名称符合某种模式,我就可以用一个 100% 匹配的正则表达式位置来攻击它,这样我就可以让 url 保持简短,同时仍然将图像与我没有用处的图像分开(我会解释它们用途上的差异,但我觉得这会偏离主题)。
无论如何,我看到了
location ~ "^/s/([0-9a-zA-Z]{4,6})$" {...
并意识到这可能接近我需要的。我在此位置的所有文件都将是 6 个字符长,仅 az,后面是任何扩展名。我认为这很简单,我可以这样做
location ~ "^([a-z]{6})$" {...
但无论我怎么修改语法,它就是无法运行。有人能解释一下吗?
答案1
这是我根据的回答和上面的评论ALex_hha
中的细节提出的建议。farfie
server {
listen 8989;
server_name www.example.net;
root /vhosts/www.example.net/public_html;
location ~ "^/([a-z]{6})(.*)\.(jpg|png|svg)$" {
rewrite ^/([a-z]{6})(.*)\.(jpg|png|svg)$" /vhosts/www.example.net/static/$1$2.$3;
}
}
关键是使用 nginxrewrite
指令从 URI 中捕获必要部分,以便将其映射到任何目录。
该root
指令仅更改文档根目录,并且 URI 按原样附加到文档根目录,在这种情况下这不是您想要的。
答案2
你可以尝试这样的事情
server {
listen 8989;
server_name www.example.net;
root /vhosts/www.example.net/public_html;
location ~ "^/([a-z]{6})(.*)\.(jpg|png|svg)$" {
root /vhosts/www.example.net/static;
}
}
并将所有图像上传到 /vhosts/www.example.net/static。使用上述设置
www.example.net/qwerty/test.png 将被翻译 -> /vhosts/www.example.net/static/qwerty/test.png