我如何检查文件是否存在于nginx?否则运行重写规则

hivapdat  于 2023-03-01  发布在  Nginx
关注(0)|答案(1)|浏览(131)

大家好,
为了在飞行中调整图像大小,我决定使用Kraken或imgix这样的服务。
我的图像将显示如下:site.com/img/path-to-img-s250x250.jpg,我想要实现的是:如果图像path-to-img-s250x250.jpg存在,那么我将显示它,如果不存在,那么运行nginx重写规则来调整原始图像的大小并保存它。
这是可能的事情还是我应该用PHP做检查?
另外,你有什么更好的想法,如何更好地处理调整图像的飞行?
多谢了

location /img/ {
    try_files $uri @getImg @resize;
}

location @getImg{
    rewrite "img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+).([0-9]{5}).(jpg|jpeg|png|gif|ico)$" /img/$1/$2-$3x$4.$6 break;
}

location @resize{
    rewrite "img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+).([0-9]{5}).(jpg|jpeg|png|gif|ico)$" $scheme://$host/image?path=$1&file=$2&ext=$6&w=$3&h=$4 break;
}

这是图片链接:site.com/img/prods/1002/filename-200x200.12345.jpg
12345用于版本化

cyej8jka

cyej8jka1#

您可以使用try_files测试一个或多个文件是否存在。dule. html #try_files)了解详细信息。
使用 * 正则表达式 * location捕获URI的元素。正则表达式位置按顺序计算,因此配置文件中的位置可能很重要。有关详细信息,请参阅此文档。
如果try_files语句的最后一个参数是URI,它将生成内部重定向。
例如:

location ~ "^/img/(.*)/([a-z0-9]+)-([0-9]+)x([0-9]+)\.([0-9]{5})\.(jpg|jpeg|png|gif|ico)$" {
    try_files $uri /img/$1/$2-$3x$4.$6 /image?path=$1&file=$2&ext=$6&w=$3&h=$4;
}

上述内容本身无法正常工作,因为许多PHP脚本使用最初请求的URI(REQUEST_URI)来确定路由。
您可以创建自定义位置以显式设置REQUEST_URISCRIPT_FILENAME参数。
例如:

location = /image {
    include        fastcgi_param;
    fastcgi_pass   ...;
    fastcgi_param  SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_param  REQUEST_URI      $uri$is_args$args;
}

这个代码块基于您现有的代码(以上只是猜测),我们首先包含全局配置文件,然后覆盖SCRIPT_FILENAMEREQUEST_URI,我假设index.php正在处理/image路由。

相关问题