当月不同日期的到期日不同

Different expires for different days in the current month

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

使用正常的 Nginx 配置,您可以通过在 map 指令中使用 $time_iso8601 变量来实现 if day_of_month 链。为简单起见,此答案忽略了闰年,并将最大到期间隔设置为 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 header,但 HTTP-date 格式很难在没有编程语言的情况下生成.