У меня есть 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 в свое местоположение / блок, поскольку это установит заголовки как для статических изображений, так и для изображений, поступающих из блока перезаписи, очевидно, вам придется либо удалить блок местоположения регулярного выражения изображений, либо добавить оператор ^ ~ в блок вашего основного местоположения