本月不同日期的有效期不同

时间:2019-01-13 10:37:48

标签: nginx nginx-config

我当前的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子句中使用当前日期吗?

1 个答案:

答案 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日期格式。