Как можно запустить скрипт при открытии изображения с помощью Nginx?

Доброго времени суток и с наступающим праздником! Прошу прощения за, возможно, глупый вопрос. 

У меня есть следующая ситуация: когда пользователь переходит по ссылке на изображение, например, site/img/imgName.jpg, мне нужно выполнить код PHP для проверки наличия этой фотографии в базе данных. Если фотография найдена, пользователь должен быть перенаправлен на страницу с запрашиваемым изображением.

Как мне определить, что запрос поступает именно к изображению, а не к обычной странице, и как запустить PHP-код из файла, находящегося в отдельной папке, при обращении к изображению? 

Заранее спасибо!
  • 18 декабря 2024 г. 4:13
Ответы на вопрос 2
Доброго времени суток! Для решения вашей задачи с использованием Nginx вам нужно настроить сервер таким образом, чтобы запросы к изображениям перенаправлялись на PHP-скрипт, который будет выполнять проверку в базе данных. Вот общее направление, как это можно сделать:

1. **Настройка Nginx**: Вам нужно будет изменить конфигурацию вашего Nginx для обработки запросов к изображениям. Например:

```nginx
server {
    listen 80;
    server_name yourdomain.com;

    location /img/ {
        # Сначала пробуем отдать файл, если его нет, отправляем на PHP-скрипт
        try_files $uri @check_image;
    }

    location @check_image {
        # Здесь запрашиваем PHP-код для обработки
        rewrite ^/img/(.*)$ /path/to/your/script.php?image=$1 last;
    }

    # Другие настройки вашего сервера...
}
```

2. **PHP-скрипт**: В вашем PHP-скрипте (`script.php`) вы должны обработать переменную `$_GET['image']` и выполнить проверку:

```php
<?php
// Подключение к базе данных
// $db = new mysqli('host', 'user', 'password', 'database');

$image_name = $_GET['image'];

// Функция для проверки наличия изображения в базе данных
function check_image_in_db($image_name) {
    // Ваш код для проверки нахождения изображения в базе данных
    // Примерный код
    // $query = $db->prepare("SELECT COUNT(*) FROM images WHERE name = ?");
    // $query->bind_param('s', $image_name);
    // $query->execute();
    // $query->bind_result($count);
    // $query->fetch();
    // return $count > 0;

    // Измените этот код на свой
    return true; // Для примера
}

if (check_image_in_db($image_name)) {
    // Если изображение найдено, перенаправляем на файл
    header("Location: /img/$image_name");
    exit();
} else {
    // Если изображение не найдено, показываем 404
    header("HTTP/1.0 404 Not Found");
    echo "Image not found.";
}
?>
```

3. **Проверка работы**: Когда клиент запрашивает изображение по пути `/img/imgName.jpg`, сервер сначала проверит, существует ли файл. Если нет, Nginx передаст запрос на скрипт. Скрипт проверит наличие изображения в базе данных и либо перенаправит на файл изображения, либо выдаст 404.

4. **Безопасность и производительность**: Убедитесь, что ваш PHP-скрипт работает быстро и оптимизирован, так как он будет запускаться для каждого запроса к изображению, который отсутствует на сервере.

Это базовый пример, который вы можете адаптировать под свои нужды. Надеюсь, это поможет вам реализовать задуманное!
Написать локейшен с регулярным выражением, срабатывающим только на урлы вида *.(jpg|png|что-там-ещё-у-вас) . Внутрь локейшена засунуть try_files , который в какой-то момент будет дёргать PHP-скрипт.
Похожие вопросы