【问题标题】:Nginx Match Image Filename Based On Part of URL?Nginx根据部分URL匹配图像文件名?
【发布时间】:2021-09-16 22:13:08
【问题描述】:

对于本地开发,我正在尝试从公共目录中提供静态内容。我的图像位于app/public/images,我的根是app/public。我的图像在/d/my_app_name/images/<image>.png 上查找。我正在匹配/d/my_app_name/images 位置,但试图弄清楚如何提取文件名并让 nginx 从图像目录中查找适当的文件名?我当前的设置:

    root /app/public;
    index index.php;


    location /d/my_app_name/images/ {
        root /images/; # <--- I guess this rule is making nginx look up a file that matches the entire relative path, rather than just the filename
    }

更新 我能够让它匹配并仅从似乎正确的目录中查找文件名,但我仍然收到未找到的错误。我假设错误中显示的相对路径是相对于根目录的,在这种情况下,该文件/目录应该存在。

    root /app/public;
    index index.php;

    location /d/my_app_name/images/ {
         alias /images/;
    } 

当我转到localhost:8380/d/my_app_name/images/my_image.png 时,它正在 app/public/images 目录中查找正确的 png 文件,但它仍然说它不存在。

[error] 8#0: *1 open() "/images/my_image.png" failed (2: No such file or directory), client: 192.168.176.1, server: devbox, request: "GET /d/my_app_name/images/my_image.png HTTP/1.1", host: "localhost:8380"

图片保存在/app/public/images目录中。

【问题讨论】:

    标签: nginx nginx-config nginx-location


    【解决方案1】:

    我认为你有倒置的位置和根路径。

    我可以建议你改变你的位置块如下:

    location /images/ {
         root /d/my_app_name/images/; # override global root to your specific path where your images are hosted
    }
    

    更多配置示例可以在official documentation找到。

    【讨论】:

    • 我不确定我是否遵循 - 位置应该与请求路径匹配,对吗?即我正在从localhost:5000/d/my_app_name/images/filename.png 查找我的图像,所以该位置与/d/my_app_name/images 匹配?
    • 这里误会了,我想你可以关注@Sam的回答。
    【解决方案2】:

    你可以使用一个简单的别名告诉 Nginx 搜索另一个路径中的所有文件。只有当您的位置只是图像并且在文档中实际使用时,Root 才会起作用:https://nginx.org/en/docs/http/ngx_http_core_module.html#alias

    root /app/public; #Use full path, ex: /home/username/repo/app/public/
    index index.php;
    
    location /d/my_app_name/images/ {
        alias /app/public/images/; # Use full path, ex: /home/username/repo/app/public/
    }
    

    【讨论】:

    • 感谢您的回答,但我不确定这是否可行(假设我理解正确)。这需要是一个可以在任何人的机器上运行的可移植解决方案,所以我不能硬编码完整路径 - 它需要相对于 nginx 根目录。
    • 我能够让它做我认为可以工作的事情,但仍然无法工作root /app/public; index index.php; location /d/my_app_name/images/ { alias /images/; } 当我转到localhost:8380/d/my_app_name/images/my_image.png 时,它正在@987654326 中查找正确的png 文件@ 目录,但它仍然说它不存在。 [error] 8#0: *1 open() "/images/my_image.png" failed (2: No such file or directory), client: 192.168.176.1, server: devbox, request: "GET /d/my_app_name/images/my_image.png HTTP/1.1", host: "localhost:8380"
    • 我必须做大量的挖掘工作才能了解 nginx 如何处理您的辅助请求。我的建议是使用大多数 nginx 安装默认使用的 /var/www/html。因为每台电脑都不一样,你可以把静态文件放在那里。我认为完整路径很常见,并且由别名支持,我会使用我的原始答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2020-10-28
    • 2021-08-01
    • 2014-07-27
    • 2014-09-24
    相关资源
    最近更新 更多