Папка перенаправления Nginx на PHP-скрипт

Я использую следующий блок конфигурации

location ~* \.(apng)$ 
{
 try_files $uri $uri/ /getbait.php$args;
 add_header  Cache-Control public;
 add_header Cache-Control must-revalidate;
 expires 7d;
}

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

Это прекрасно работает. Однако я знаю, что требования немного другие. Блок конфигурации выше, как он есть, уловит все. Мне нужно изменить его, чтобы водяной знак отличался в зависимости от точного пути запроса. Так, например,

https://example.com/watermark/example.apng 

выплюнул бы изображение с одним водяным знаком, а

https://example.com/sample/example.apng

выплюнул бы изображение с другим водяным знаком. Я знаю, что мне нужно изменить бит location ~ * \ моей директивы выше и указать пути APNG с подстановочными знаками к двум разным папкам с двумя разными блоками управления. Однако, мои знания конфигурации Nginx и соответствующего RegEx попросту не подходят для этой задачи. Надеюсь, кто-нибудь здесь сможет мне помочь.

1
задан 11 January 2018 в 09:48
2 ответа

I собирался удалить этот вопрос, но подумал, что оставлю его здесь с решением, которое я в конечном итоге нашел для других, стремящихся делать подобные вещи

Вот что в конечном итоге сработало для меня

location ~* ^/path/to/dirA/.+\.(apng)$
{
 add_header Access-Control-Allow-Origin "*";
 add_header  Cache-Control public;
 add_header Cache-Control must-revalidate;
 expires 7d;
 try_files $uri $uri/ /phpscriptA.php$args;    
}

Я должен объяснить, что в моем контексте изображения здесь доступны только один раз, поскольку фактические изображения доставляются CDN. Единственный раз, когда к этому URL обращаются напрямую, это когда CDN извлекает источник

0
ответ дан 4 December 2019 в 04:15

Простым решением этой проблемы было бы просто посмотреть на $ _ SERVER ['REQUEST_URI'] в сценарии PHP.

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

Изменить: В качестве примера -

Существующая конфигурация соответствует любому .apng файл и ищет файл или отправляет его в php-скрипт.

location ~* \.(apng)$ 
{
 try_files $uri $uri/ /getbait.php$args;
 add_header  Cache-Control public;
 add_header Cache-Control must-revalidate;
 expires 7d;
}

В getbait.php вы можете сделать что-то вроде следующего:

// REQUEST_URI should contain something like /path/to/watermark/imagename.apng

if( preg_match('/\/([^\/]+)\/([^\.]+.apng)$/', $_SERVER['REQUEST_URI'], $imageData) ){

    // $imageData[1] should now be watermark
    // $imageData[2] should be imagename.apng

    // At this point you can use a switch statement like below,
    // or an if statement, look up the watermark in some database,
    // or even just use $imageData[1] directly as the filename of the
    // watermark to load - if you're using an image overlay. (that way adding 
    // new watermarks is just a case of uploading the new watermark overlay 
    // image)

    switch($imageData[1]){
        case 'watermark1':
            // code
            break;
        case 'watermark2':
            // code
            break;
    }
}
0
ответ дан 4 December 2019 в 04:15

Теги

Похожие вопросы