htaccess文件正确检测根目录中丢失的文件,但未检测到丢失的子目录

Jag*_*age 1 .htaccess

我有一个.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]
Run Code Online (Sandbox Code Playgroud)

该.htaccess文件放在名为"uploads"的文件夹中.例如,我的uploads文件夹也有oranges.jpg.

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

HTTP://localhost/uploads/oranges_asdf.jpg

以下url 不会正确地将请求传递给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,但是当你执行/ path/to /时uploads/test.jpg因为test.jpg是知道请求不存在的终止点.即使这不是httpd停止字符串的原因,你还有很多其他可以帮助你的变量.

这个重写条件:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f 
Run Code Online (Sandbox Code Playgroud)

现在这个为MVC框架创建调度程序的技巧非常受欢迎,并且确实有效,因为/ path/to/uplaods/fake是一个文件或目录,并且会将您的请求发送给您的图像调度程序.

这是您的扩展匹配条件的真正修复...您需要获取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]
Run Code Online (Sandbox Code Playgroud)

我清理了你在文件名上的匹配,因为你将各种废话与那个实际上(当未转义时)告诉preg匹配引擎匹配任何东西的时间段相匹配.因此,反斜杠期间会使preg匹配一个实际的期间.

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