Разные истекает для разных дней в текущем месяце - PullRequest
0 голосов
/ 13 января 2019

Моя текущая конфигурация Nginx:

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

  try_files $uri $uri.html @proxy;
}

Но часть expires 1d; не соответствует моим потребностям. На самом деле содержание хорошо до конца текущего месяца. Или сделать это проще до 00:01 am 1-го числа следующего месяца. На самом деле это даже не должно быть на 100% точным. Если я немного потеряю оптимизацию за последние 1-3 дня, это не проблема (если подумать о проблеме 28 февраля).

Решение, которое я могу реализовать, - это задание cron, которое обновляет конфигурацию Nginx раз в день и перезагружает Nginx с помощью скрипта Bash. Но это не правильно. Я бы хотел решить эту проблему в конфигурации 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 голосов
/ 13 января 2019

В обычной конфигурации Nginx вы можете реализовать цепочку if day_of_month, используя переменную $time_iso8601 в директиве map. Для простоты этот ответ игнорирует високосные годы и устанавливает максимальный интервал истечения в 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;
    ...
}

Регулярные выражения оцениваются по порядку, поэтому размещайте наименее специфичные внизу списка. Подробнее см. в этом документе .


Оптимальным решением было бы создание заголовка HTTP Expires с фактической датой и временем, когда документ устарел, но формат даты HTTP трудно создать без языка программирования.

...