代码之家  ›  专栏  ›  技术社区  ›  Jurian Sluiman

.htaccess:在rewriterule之后检查文件是否存在

  •  0
  • Jurian Sluiman  · 技术社区  · 15 年前

    如果在my.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]
    

    但那不管用。如果一个文件已经被另一个重写器重写了,有什么办法可以检查它的存在吗?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Gumbo    15 年前

    反过来做:仅当请求实际存在时才将其重写到目标:

    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]
    

    顺便问一下:不要用 .* 如果你能更具体一点。在这种情况下 [^/]+ 只能匹配路径段。

    推荐文章