22

我有一个包含以下内容的 .htaccess 文件:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^(.*)$ entryPoint.php [QSA]
</IfModule>

有了这个,我希望将所有请求重定向到文件entryPoint.php,以便它可以检查它们:

  • 如果没有扩展,则必须是模块
  • 如果有.php,那就是黑客攻击
  • 如果它是一个 .png,那么它就是一个“安全”的调用。

    在图像的情况下,我曾经输出标题file_get_contents()及其内容。我发现它比直接阅读要慢一些。

我的问题是:

entryPoint.php如果有图像引用,如何防止此 .htaccess 调用?

非常感谢对我已经拥有的代码的额外反馈!

4

3 回答 3

45

据我了解,您想要处理所有非图像抛出您的 php 文件。正确的?

如果是这样,那么这就是您需要的:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>

RewriteEngine On
RewriteCond %{REQUEST_URI}  !(\.png|\.jpg|\.gif|\.jpeg|\.bmp)$
RewriteRule (.*)  entryPoint.php [QSA]

</IfModule>

请记住添加以删除您想要的任何图像扩展名!如果我误解了,请告诉我纠正我的答案!

于 2011-08-15T01:33:31.423 回答
9

您可以使用这样的东西来停止重写图像

RewriteRule \.(jpg|png)$ - [L]

这条规则说“如果请求的文件以句点结尾,后跟“jpg”或“png”,那么不要重写它。

$字符仅标记“字符串/文件名的结尾”,-表示“如果此规则匹配,则不重写 URL”,[L]意思是“如果此规则匹配,则不再处理任何规则。

我要补充一点,处理这类事情的通常方法是只应用一个笼统的声明“如果这个文件存在,就直接提供文件,但是任何不存在的东西都由 PHP 处理。” 这种类型的规则如下所示:

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

这表示“如果请求不是针对存在的文件或目录,请将请求传递给 index.php,并将原始路径作为名为 'request' 的查询字符串参数传递,并将任何其他查询字符串参数附加到新请求。 "

于 2011-08-15T01:32:30.870 回答
7
RewriteCond %{REQUEST_FILENAME} !\.(png|jpg|gif)$

把这条线放在你的前面RewriteRule

于 2011-08-15T01:30:13.453 回答