当月不同日期的到期日不同
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 格式很难在没有编程语言的情况下生成.
我当前的 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 格式很难在没有编程语言的情况下生成.