我正在尝试让 nginx 发送过期标头,我尝试了两种不同的方法:
location ~* ^.+\.(ico|css|js|gif|jpe?g|png)\?[0-9]+$ {
expires max;
}
和
location / {
if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)\?[0-9]+$") {
expires max;
break;
}
#....
}
这些都不起作用。没有发送任何过期标头。有什么想法可以调试此问题吗?
答案1
位置应该仅在路径上,没有查询字符串,因此这不起作用。
请尝试以下操作:
位置 ~* \.(ico|css|js|gif|jpe?g|png)$ { 最大有效期限; }
或者,至少下面的方法也应该有效:
位置 ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ { 最大有效期限; }
答案2
通过在其中放置附加指令来测试以确保位置块被调用,例如:
location ~* \.(ico|css|js|gif|jpe?g|png)$ {
expires max;
auth_basic "Restricted, please login";
auth_basic_user_file htpasswd.users;
}
如果在请求匹配文件时没有出现身份验证提示,那么您可以确定该块没有由于之前的中断或其他原因而被调用。
答案3
这些行确实有效,我只是测试错了。这些行正确地尝试仅缓存带时间戳的资源(末尾带有 ?id 的资源),而我查看的是无时间戳的资源。
答案4
是否使用 nginx 作为缓存代理?如果是,请注意上游缓存指令是受尊重的,但您仍然可以指示 nginx 不要使用 proxy_ignore_headers
proxy_ignore_headers X-Accel-Expires Expires Cache-Control;