我对 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;
}
}