子文件夹深度未知的 nginx 位置

nginx location with unknown subfolder depth

我想要自定义图像位置,以便设置更好的 expires 值并将它们从 access.log 中删除。

图像的本地路径应该是这样的 /var/www/html/public/image/user/{username}/{?subfolder}/filename.jpg

图片所在的子文件夹可以有一个或多个。

url 应该类似于 http://example.com/image/user/{username}/{?subfolder}/filename.jpg。由于文件夹深度可能不同 user,因此我无法对其进行硬编码。

我用这个位置规则试过了,但是nginx试图把它定位在默认的根目录而不是指定的根目录。

location /image/[^\]+/.*\.(jpg|jpeg|gif|png|css|ico)$ {
    root /var/www/html/public/image;
    expires           30d;
}

我在 PCRE 测试仪上尝试了这个表达式,它成功了。感谢对此的任何帮助。

如果您将示例中的 root 设置为 /var/www/html/public/image,那么对 /image/user/foo.jpg 的请求将以 /var/www/html/public/image/image/user/foo.jpg 结束,这是不希望的。所以我认为你不应该触摸 root(它必须保持指向 public 目录)。

简单地说:

location ^/image/.*/.*\.(jpg|jpeg|gif|png|css|ico)$ {
    expires 30d;
}

会完成任务的。

如果你的文件名是 hashed/versioned(例如 foo.123.jpg),你可以使用 immutable 进行积极的缓存:

location ^/image/.*/.*\.(jpg|jpeg|gif|png|css|ico)$ {
    immutable on;
}