如何检查Nginx中是否存在文件?否则运行重写规则

时间:2019-03-28 10:17:50

标签: nginx mod-rewrite url-rewriting

大家好,

为了即时调整图像大小,我决定使用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用于版本控制

1 个答案:

答案 0 :(得分:2)

您可以使用try_files测试一个或多个文件的存在。有关详细信息,请参见this document

使用正则表达式 location捕获URI的元素。正则表达式的位置是按顺序评估的,因此配置文件中的位置可能很重要。有关详细信息,请参见this document

如果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路由。