Назад | Перейти на главную страницу

Заголовок кеша для динамически создаваемого URL

У меня есть PHP-скрипт, который генерирует миниатюру на основе существующего пути (больше информации). Основная идея такова:

Учитывая корень документа /web/, образ живет в /web/images/foo.jpg. Когда предопределенный фильтр эскизов с именем thumb запрашивается в URL /web/thumb/foo.jpg, сценарий PHP подбирает его и генерирует миниатюру в этом месте, чтобы он был обслужен напрямую через Nginx при следующем запросе.

Теперь это работает со следующей (упрощенной) конфигурацией:

server {
  location / {
    try_files $uri @rewriteapp;
  }
}

куда @rewriteapp содержит правило перезаписи для приложения.

Проблема в том, что я хочу добавить Expires заголовок к кешированным эскизам. Но когда я добавляю что-то вроде этого

location ~* \.(jpe?g|gif|png)$ {
  expires 1y;
}

Он работает только с сгенерированными эскизами, но возвращает 404 по запросу, который должен вызвать @rewriteapp правило.

Я попытался добавить этот последний блок до или после первого блока местоположения, я также попытался включить тот же самый try_files заявление внутри моего местоположения с истечением срока действия. Но ничего из этого не работает.

Как я могу добавить заголовок к моим изображениям?

ОБНОВИТЬ:

В принятом ниже ответе содержится более подробное объяснение, почему это не удалось. В моем случае я решил это, заменив второй блок местоположения следующим:

location /thumb/ {
  try_files $uri @rewriteapp;
  expires 1y; access_log off; log_not_found off;
}

Я сделал почти то же самое, что и вы, я скопирую свой код nginx vhost ниже

в основном порядок ваших блоков местоположения несколько важен в этом случае в соответствии с: http://nginx.org/en/docs/http/ngx_http_core_module.html#location

в любом случае вот мой код nginx - вы, вероятно, можете изменить его для своей локальной среды:

location ~ ^/thumbnails/(.*)/(.*)$ {
    try_files /thumbs/$1/cache/$2.jpeg /thumbs/$1/phpThumb.php?src=../../images/product/$2;
    expires      6w;
    fastcgi_hide_header Set-Cookie;
}

location ~* \.(ico|pdf|flv|jpg|jpeg|png|gif|js|swf|css|js)$ {
    expires      6w;
}

ключевые моменты, на которые следует обратить внимание: каталог эскизов не существует на диске (он используется исключительно для целей try_files

этот код в основном означает, что для входящего запроса скажем /thumbnails/small/13909967441.JPG

он попытается найти файл в /thumbs/small/cache/13909967441.JPG.jpg (да, я знаю двойное расширение - это был взлом производительности, что еще я могу сказать!) если он его находит, он обслуживает его с заголовком expires, если он не находит его, он затем перезаписывает запрос внутри настроенного сценария миниатюр для того размера, который генерирует изображение и обслуживает его, заголовок expires также добавляется к запросам, которые проходят внутреннюю перезапись в запрос PHP

трюк именно в этой строке из документации:

Если у самого длинного совпадающего префикса есть модификатор «^ ~», то регулярные выражения не проверяются.

Это означает, что вы поместите свою перезапись / местоположение над правилами регулярного выражения, такими как общий для файлов изображений, и убедитесь, что флаги и наличие ^~ или в моем случае ~ ^ (они оба приравниваются к одному и тому же правилу) в нем предотвращает совпадение правил регулярных выражений позже. Это потому, что правила регулярных выражений обычно переопределяют совпадения без регулярных выражений, если это не = или ^~ соответствие

запросы, попавшие в /thumbnails path никогда не будет соответствовать общему совпадению регулярного выражения для файлов изображений из-за вышеупомянутого местоположения, которое блокирует сопоставление регулярных выражений, и того факта, что блок регулярного выражения находится после блока местоположения, поэтому не может совпадать до него.

Обновление - на основе вашего кода nginx

вы должны добавить строку конфигурации expires в свое местоположение / блок, поскольку это установит заголовки как для статических изображений, так и для изображений, поступающих из блока перезаписи, очевидно, вам придется либо удалить блок местоположения регулярного выражения изображений, либо добавить оператор ^ ~ в блок вашего основного местоположения