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

nginx обслуживает изображение через PHP скрипт

Я не очень опытен с 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;
    }
}