Я использую следующий блок конфигурации
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 попросту не подходят для этой задачи. Надеюсь, кто-нибудь здесь сможет мне помочь.
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 извлекает источник
Простым решением этой проблемы было бы просто посмотреть на $ _ 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;
}
}