2011-03-14 60 views
1

我有我使用捕捉时请求不存在图像,所以我可以做一个.htaccess文件。从目录中的.htaccess文件是在请求时,文件能够正确检测丢失的图像。但是,如果我要求从技术上不存在的子目录中的图像,的.htaccess不会送我到我的图像处理程序。有人可以帮我匹配任何不存在的子目录吗?htaccess文件正确地从根目录检测丢失的文件,但不检测缺失的子目录

这里是我的htaccess:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} .(jpg|jpeg|gif)$ 
RewriteRule ^(.*)$ missingimage.php?img=$1 [QSA,L] 

那.htaccess文件放在一个名为 “上传” 文件夹中。例如,我的上传文件夹也有oranges.jpg。

以下URL将正确地将请求传递给missingimage.php:

http://localhost/uploads/oranges_asdf.jpg

以下网址将不正确传递给missingimage.php请求,而是返回来自apache的标准404:

http://localhost/uploads/not_a_real_directory/oranges.jpg

如何修改我的htaccess赶上请求不存在的目录,仍然把它们传递给我的图像处理程序?谢谢。

回答

9

如果请求不存在,REQUEST_FILENAME实际上并不包含完整的绝对路径。我没有真正深入研究httpd核心代码的理论就是它认为我们已经足够了解请求并不存在,所以我们不要再看了。

即,如果您要求/uploads/fake/test.jpg它会REQUEST_FILENAME包含/ path/to/uploads/fake,实际上并不会继续追加/test.jpg,但是当您执行/路径/到/上传/ test.jpg放在因为test.jpg放在是它知道该请求不存在终止。即使这是不是为什么的httpd停止串有你有很多其他变量,可以帮助你的原因。

这改写条件:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 

是可笑的流行,现在这招创建MVC框架的调度员和不实际工作,因为/路径/到/ uplaods /假的就是niether文件,也不是目录,并将您的请求发送到您的映像调度程序。

下面是您的扩展匹配条件的真正修复...您需要获取REQUEST_URI,因为它将包含用户实际请求的内容(/uploads/fake/test.jpg),包括文件扩展名,您可以使用它在你的第三个RewriteCond中匹配文件扩展名。因为我们要使用第三规则,我清理了你的前两个匹配。

RewriteEngine On 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d 
RewriteCond %{REQUEST_URI} ^[A-Za-z0-9\/_-]+\/[A-Za-z0-9_-]+\.(jpg|jpeg|gif)$ 
RewriteRule ^(.*)$ missingimage.php?img=$1 [QSA,L] 

我清理您的文件名匹配为你与超前时段实际上是(当非转义)匹配各种废话,告诉预浸匹配引擎匹配任何东西。所以,反斜杠时间会使preg匹配一个实际的时间段。

我也清理了比赛的上半场请求URI包括/alpha/num/directories_with/underscores-and-dashes/followed/by/alpha-num_filenames.jpg|jpeg|gif,随意删除,如果你不想要它。

+0

优雅地陈述。 – Jage 2011-03-17 18:20:11

+0

这太棒了。我不知道这个功能。谢谢一堆! – 2011-05-03 20:51:32

相关问题