Nginx 将文件夹重定向到 PHP 脚本

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

我本来想删除这个问题,但后来决定把它留在这里,并附上我最终找到的解决方案,以便其他寻求做类似事情的人受益

以下是最终对我有用的方法

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;
    }
}

相关内容