nginx 通过 php 脚本提供图像

nginx 通过 php 脚本提供图像

我对 nginx 不是很熟悉,所以对 vhost 的设置有点迷茫。基本上,我的应用程序在提供一些图像时,通过 php 脚本提供它们,这在 apache 中非常简单:查找物理图像 -> 如果未找到,则将所有内容推送到 index.php,并将请求字符串作为参数。不,我正在尝试在 nginx 上运行此应用程序,除了通过脚本提供图像外,一切都正常(我得到的是 404)。这是我的 nginx vhost:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).subdomain.domain.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

    location / {
            try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
            add_header        Cache-Control public;
            add_header        Cache-Control must-revalidate;
            expires           7d;
    }

    location ~ \.php$ {
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            include fastcgi_params;
            fastcgi_index index.php;
    }

    location ~ /\.ht {
            deny all;
    }

}

看起来它只是在物理位置寻找图像,这适用于实际的物理图像,但不适用于通过脚本提供的动态图像。任何帮助或指导都非常感谢。

更新:好的,所以我想通了,如果我从缓存控制位置删除 .jpg,它就可以工作了,但我仍然想为那些动态图像请求设置缓存标头,那么如何让它通过 php 运行,然后设置缓存标头?

答案1

您可以将此location块用于您的图像:

location ~* \.(jpg|jpeg|gif|png|bmp)$ {
    try_files $uri $uri/ /index.php$is_args$args;

    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;
}

您可能需要修改行/index.php?$is_args$args上的部分内容try_files以便获取脚本的正确参数,因为您的初始问题并未清楚地显示您想要的参数是什么。

然后,对于其余的缓存选项,使用以下location块:

location ~* \.(ico|pdf|flv|swf|exe|html|htm|txt|css|js)$ {
    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;
}

我还将 添加$到正则表达式匹配字符串中,以便只有以扩展名结尾的请求才会由该块处理。例如,使用您的初始配置,您指定缓存指令的块https://example.com/path/image.jpg75783将处理URL。location

另一种选择是在 PHP 脚本中设置图像缓存标头。

答案2

为了将标头和到期日期添加到所有 URI,您需要将语句放在server块中。在这种情况下,每个位置块都会继承它们。例如:

server {
    ...

    add_header        Cache-Control public;
    add_header        Cache-Control must-revalidate;
    expires           7d;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        ...
    }

    location ~ /\.ht {
        deny all;
    }
}

相关内容