我当前的Nginx配置:
location / {
expires 1d;
add_header Cache-Control public;
try_files $uri $uri.html @proxy;
}
但是expires 1d;
部分不符合我的需求。实际上,该内容在本月底之前是好的。或者,使其更轻松,直到下个月第一天的00:01 am
。实际上,它甚至不必是100%准确的。如果最近1-3天我失去了一点优化,那不是问题(考虑2月28日的问题)。
我可以实现的解决方案是一项cron作业,该作业每天更新一次Nginx配置,并使用Bash脚本重新加载Nginx。但这感觉不对。我想在Nginx配置中解决此问题。
因此,我正在考虑一组if / else结构,该结构可获取当月的当前日期,然后设置一个数字。
这个想法(实际上不是Nginx配置代码)将是:
if day_of_month = 1
expires 31d
end
if day_of_month = 2
expires 30d
end
if day_of_month = 3
expires 29d
end
...
我正在阅读http://nginx.org/en/docs/http/ngx_http_headers_module.html,但不确定是否可以执行以下操作:
if current_month = 1
expires epoche "00:00:00 01-02-$current_year"
end
if current_month = 2
expires epoche "00:00:00 01-03-$current_year"
end
if current_month = 3
expires epoche "00:00:00 01-04-$current_year"
end
...
if current_month = 12
expires epoche "00:00:00 01-01-($current_year + 1)"
end
在常规Nginx配置中解决此问题的最佳方法是什么?我可以在if子句中使用当前日期吗?
答案 0 :(得分:1)
在正常的Nginx配置下,您可以通过在if day_of_month
指令中使用$time_iso8601
变量来实现map
链。为简单起见,此答案忽略了leap年,而是将最大有效期间隔设置为5天,只是为了减少map
中的条目数。
map $time_iso8601 $expires {
default 5d;
~^....-(04|06|09|11)-27T 4d;
~^....-(04|06|09|11)-28T 3d;
~^....-(04|06|09|11)-29T 2d;
~^....-(04|06|09|11)-30T 1d;
~^....-02-25T 4d;
~^....-02-26T 3d;
~^....-02-27T 2d;
~^....-02-28T 1d;
~^....-..-28T 4d;
~^....-..-29T 3d;
~^....-..-30T 2d;
~^....-..-31T 1d;
}
server {
...
expires $expires;
...
}
正则表达式是按顺序求值的,因此将最不具体的表达式放在列表的底部。有关更多信息,请参见this document。
最佳解决方案是在文档过期时使用实际的日期和时间生成HTTP Expires标头,但是如果没有编程语言,则很难生成HTTP日期格式。