Я не очень опытен с nginx, поэтому я немного потерялся с настройкой vhost. В основном мое приложение, когда некоторые изображения обслуживают их через php-скрипт, это очень просто с apache: ищите физическое изображение -> если не найдено, вставьте все в index.php со строкой запроса в качестве параметров. Нет, я пытаюсь запустить это приложение на nginx, и все работает, кроме изображения, передаваемого через скрипт (я просто получаю 404). Вот мой хост для nginx:
server {
listen 80;
server_name ~^(www\.)?(?<sname>.+?).subdomain.domain.com$;
root /var/www/$sname/current/public;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
include fastcgi_params;
fastcgi_index index.php;
}
location ~ /\.ht {
deny all;
}
}
Кажется, что он ищет изображение только в физическом месте, это работает для реальных физических изображений, но не для динамических, где они обслуживаются скриптом. Любая помощь или руководство приветствуются.
Обновление: хорошо, поэтому я понял, что если я удалю .jpg из местоположения элемента управления кешем, он будет работать, но я все еще хочу установить заголовки кеша для этих запросов динамического изображения, так как мне заставить его запускаться через php, а затем установить кеш заголовок после этого?
Вы можете использовать это location
блок для ваших изображений:
location ~* \.(jpg|jpeg|gif|png|bmp)$ {
try_files $uri $uri/ /index.php$is_args$args;
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
}
Вам может потребоваться изменить /index.php?$is_args$args
часть на try_files
строка, чтобы вы получили правильные параметры для своего скрипта, поскольку ваш первоначальный вопрос не ясно показал, какие параметры вам нужны.
Затем для остальных параметров кеширования используйте этот location
блок:
location ~* \.(ico|pdf|flv|swf|exe|html|htm|txt|css|js)$ {
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
}
Я также добавил $
в строки соответствия регулярному выражению, чтобы этот блок обрабатывал только запросы, заканчивающиеся расширением. Например, в вашей начальной конфигурации URL https://example.com/path/image.jpg75783
будет обработано вашим location
блок, в котором вы указываете свои директивы кеширования.
Другой альтернативой является установка заголовков кэширования изображений в сценарии PHP.
Чтобы добавить заголовки и срок действия ко всем URI, вам необходимо поместить операторы в server
блок. В этом случае они наследуются каждым блоком местоположения. Например:
server {
...
add_header Cache-Control public;
add_header Cache-Control must-revalidate;
expires 7d;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
...
}
location ~ /\.ht {
deny all;
}
}