我有一个.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文件放在名为“uploads”的文件夹中。例如,我的uploads文件夹也有oranges.jpg。
以下网址会正确地将请求传递给missingimage.php:
以下网址将 NOT 正确地将请求传递给missingimage.php,而是从apache返回标准404:
如何修改我的htaccess来捕获对不存在的目录的请求,并将它们传递给我的图像处理程序?谢谢。
答案 0 :(得分: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
现在非常受欢迎,因为这个创建MVC框架调度程序的技巧确实有效,因为/ path / to / uplaods / fake不是文件也不是目录,并且会将您的请求发送给您的图像调度程序。< / p>
这是您的扩展匹配条件的真正修复...您需要获取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匹配引擎匹配任何东西的时间段相匹配。因此,反斜杠周期将使preg匹配实际周期。
我还清理了上半场的比赛请求uri包括/alpha/num/directories_with/underscores-and-dashes/followed/by/alpha-num_filenames.jpg|jpeg | gif,随时删除如果你不想要它。