我使用以下配置块
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
我本来想删除这个问题,但后来决定把它留在这里,并附上我最终找到的解决方案,以便其他寻求做类似事情的人受益
以下是最终对我有用的方法
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 提供的。只有当 CDN 执行其源拉取时,才会直接访问此 URL
答案2
对此问题的简单解决方法就是查看$_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;
}
}