使用 Nginx 从两个不同的目录提供图像

使用 Nginx 从两个不同的目录提供图像

这应该是基础的...我是新手,无论用多少谷歌搜索和搜索堆栈交换都无济于事。

我有一个网站,希望能够提供来自不同目录的图片。我认为最简单的方法是将 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

相关内容