mod_rewrite -if被忽略

时间:2012-07-23 14:52:24

标签: .htaccess mod-rewrite

我有一个图像缓存系统,我可以根据需要生成某些图像尺寸。我使用modrewrite检查文件并调用图像创建系统,如果它不存在。我遇到的问题是,即使图像确实存在,它也在调用图像创建系统!

modrewrite很简单(images子目录中的站点)

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /images/index.php?id=$1 [L,QSA]

我甚至尝试删除-d目录检查令人困惑。我现在得到它,以便它检查index.php代码中存在的文件 - 报告它确实存在。

我在html中使用了网址images/cache/140x20/Test.JPG - 该文件存在,因此RewriteCond不应该调用index.php代码 - 但它出于某种原因吗?

我确定它的东西显而易见,但我无法弄明白

1 个答案:

答案 0 :(得分:1)

  

.htaccess位于images目录中。使用R = 302我得到正确的路径www.domain.com/images/index.php?id=cache/140x20/Test.JPG

这很奇怪。我在一个子目录下进行测试,并为%{REQUEST_FILENAME}获得了一些意想不到的值。但是我能够通过从文档根目录重建来使检查正常工作。也许我对%{REQUEST_FILENAME}的理解或者apache用来创建文件路径的URI路径的基础机制与我预期的不同。

尝试:

RewriteCond %{DOCUMENT_ROOT}${REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}${REQUEST_URI} !-d
# and maybe for good measure
RewriteCond %{REQUEST_URI} !index.php

编辑:

如果您的扩展程序全部大写,但图片文件扩展名始终全部为小写,则可以使用RewriteMap并使用tolower函数定义地图:

(服务器或vhost配置中的某处:

RewriteMap lowercase int:tolower

然后在你的htaccess文件中(高于你的其他规则),将文件名更改为小写:

# first check to make sure request doesn't already have all lowercase image extension
RewriteCond %{REQUEST_URI} !\.(jpe?g|png|bmp|gif)$
RewriteRule ^(.*)\.(jpe?g|png|bmp|gif)$ /$1.${lowercase:$2} [NC,L]

您也可以使用整个文件名或整个路径执行类似操作。