【问题标题】:.htaccess: Check file existence after RewriteRule.htaccess:在 RewriteRule 之后检查文件是否存在
【发布时间】:2010-09-17 09:18:30
【问题描述】:

如果我的 .htaccess 中有一些规则:

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^.*$ - [NC,L]

RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.(.*)\.([a-z]{2,4})$ /assets/img$1/.$2.$4/$3.$4 [NC,L]

这会导致 /assets/img/path/image.jpg > /assets/img/path/image.jpg

第二条规则:/assets/img/path/image.small.jpg > /assets/img/path/.image.jpg/small.jpg

现在我想检查 small.jpg 是否存在,所以我将最后一条规则替换为:

RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.(.*)\.([a-z]{2,4})$ /assets/img$1/.$2.$4/$3.$4 [NC]
RewriteCond %{DOCUMENT_ROOT}/assets/img$1/.$2.$4/$3.$4 !-f
RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.(.*)\.([a-z]{2,4})$ /assets/img/image.php?path=$1&file=$2.$4&template=$4 [NC,L,QSA]

但这不起作用。如果文件已被另一个 RewriteRule 重写,有什么想法如何检查文件是否存在?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    反之亦然:仅在实际存在的情况下将请求重写到目的地:

    RewriteCond %{DOCUMENT_ROOT}/assets/img$1/.$2.$4/$3.$4 -f
    RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.(.*)\.([a-z]{2,4})$ /assets/img$1/.$2.$4/$3.$4 [NC]
    RewriteRule ^assets/img(.*)/([a-zA-Z0-9-_\.]*)\.(.*)\.([a-z]{2,4})$ /assets/img/image.php?path=$1&file=$2.$4&template=$4 [NC,L,QSA]
    

    顺便说一句:如果可以更具体,请不要使用.*。在这种情况下,[^/]+ 只能匹配一个路径段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2011-09-12
      • 2019-03-07
      相关资源
      最近更新 更多