首页 > 解决方案 > Nginx 显示正确的重写数据,但未按预期执行

问题描述

我有一个使用 fastcgi 在 Nginx 后面运行的 laravel 应用程序。www.example.com/media/images/someImage.jpeg上提供了图片

在www.example.com/media/images/660x440/someImage.jpeg上还有相同图像的不同尺寸的图像

如果在www.example.com/api/images/660x440/someImage.jpeg上不存在此图像,则在 laravel 上运行一个脚本可以使该图像可用于此大小

例如,如果www.example.com/media/images/660x440/someImage.jpeg不存在,则可以访问www.example.com/api/images/660x440/someImage.jpeg ,这将显示图像,现在也显示此图像存在于www.example.com/media/images/660x440/someImage.jpeg下,希望这是有道理的。

好的,所以我现在想弄清楚的问题是如何通过 nginx 重写来实现这一点。

想法是当用户尝试访问 www. example.com/media/images/660x440/someImage.jpeg 并且它不存在,nginx 将其重写为 /api/images/660x440/someImage.jpeg (脚本)并显示生成的图像,但这一切都没有改变网址。所以请求的 URL 保持为 www。example.com/media/images/660x440/someImage.jpeg 但在后台它请求 /api/images/660x440/someImage.jpeg 处的脚本并在同一 www 显示生成的图像。example.com/media/images/660x440/someImage.jpeg。

我的 nginx 配置如下

server {
    listen  8080;
    root /var/www/public;
    index index.php index.html index.htm;
    client_max_body_size 100M;
    resolver kube-dns.kube-system.svc.cluster.local;       #this is for rancher purposes
    set $target app-fpm.app.svc.cluster.local;             #also this

    error_log /var/log/nginx/error.log notice;

    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    location /media/images/ {
        alias /var/www/storage/app/public/media/images/;
        try_files $uri /$uri @generator;
    }
    location @generator {
        rewrite ^/media/images/(.*)  /api/images/$1 last;
    }
    location ~ ^/.+\.php(/|$) {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        fastcgi_pass $target:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

我已经在 nginx 中启用了重写调试,并且在错误日志中我可以看到这个 -

2020/09/11 23:14:28 [notice] 1034#1034: *161 "^/media/images/(.*)" matches "/media/images/660x440/someImage.jpeg", client: 10.42.0.0, server: , request: "GET /media/images/660x440/someImage.jpeg HTTP/1.1", host: "www. example .com"
2020/09/11 23:14:28 [notice] 1034#1034: *161 rewritten data: "/api/images/660x440/someImage.jpeg", args: "", client: 10.42.0.0, server: , request: "GET /media/images/660x440/someImage.jpeg HTTP/1.1", host: "www. example .com"

如您所见,重写的数据是正确的,它是 /api/images/660x440/someImage.jpeg,但根据 access.log 显示 404 错误

10.42.0.0 - - [11/Sep/2020:23:33:43 +0300] "GET /media/images/660x440/someImage.jpeg HTTP/1.1" 404 622 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"

但它应该显示新生成的图像。这甚至可能是我在这里想要实现的吗?

非常感谢您的帮助,谢谢!

标签: phpnginxfastcgi

解决方案


推荐阅读