1

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

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

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

我什至尝试删除-d目录检查的情况,这使它感到困惑。我现在得到了它,以便它检查文件是否存在于 index.php 代码中 - 它报告它确实存在。

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

我确定它很明显,但我就是想不通

4

1 回答 1

1

.htaccess 位于图像目录中。使用 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

编辑:

如果您的扩展名全部大写但图像文件扩展名始终全部小写,则可以使用RewriteMaptolower并使用以下函数定义映射:

(在您的服务器或虚拟主机配置中的某处:

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]

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

于 2012-07-23T17:21:48.123 回答