Nginx 本月不同日期的不同到期日

Nginx 本月不同日期的不同到期日,nginx,nginx-config,Nginx,Nginx Config,我当前的Nginx配置: location / { expires 1d; add_header Cache-Control public; try_files $uri $uri.html @proxy; } 但1d到期零件不符合我的需要。实际上,直到本月底,内容都是好的。或者在下个月的第一天凌晨00:01之前简化操作。事实上,它甚至不必100%准确。如果我在过去的1-3天里失去了一点优化,那不是问题(想想2月28日的问题) 我可以实现的解决方案是一个cron作业,它每天更新一

我当前的Nginx配置:

location / {
  expires 1d;
  add_header Cache-Control public;

  try_files $uri $uri.html @proxy;
}
1d到期零件不符合我的需要。实际上,直到本月底,内容都是好的。或者在下个月的第一天凌晨00:01之前简化操作。事实上,它甚至不必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
...
我正在阅读,但我不确定这样做是否有效:

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

对于正常的Nginx配置,您可以使用
map
指令中的
$time\u iso8601
变量来实现您的
if day\u of\u month
链。为简单起见,此答案忽略闰年,并设置了5天的最大到期时间间隔,只是为了减少
映射中的条目数

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;
    ...
}
正则表达式是按顺序计算的,因此将最不特定的表达式放在列表的底部。更多信息,请参阅


最佳的解决方案是生成一个HTTP Expires头,其中包含文档过期的实际日期和时间,但是如果没有编程语言,HTTP日期格式很难生成