htaccess重写规则排除带扩展名的文件

时间:2018-01-23 16:08:56

标签: php apache .htaccess redirect url-rewriting

我的htaccess文件中有以下重写规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+) index.php [L]

这样我就防止Apache在发生错误时管理404错误并重定向到特定文件。当我键入不存在的URI时,Apache只会按预期重定向到“index.php”。到目前为止一切都如预期的那样当该规则影响具有扩展名的文件时,会出现问题。第一个例子是浏览器自动请求的“favicon.ico”,也调用我的“index.php”脚本,这意味着对同一个脚本的两次调用是一种不受欢迎的行为。当我在HTML标记中请求不存在的文件时也会发生这种情况(所有文件都被认为是相同的:最终的HTTP请求)。

有没有办法可以从规则中排除带扩展名的文件?

所需行为的示例:

我希望这些由规则处理并重定向到index.php(规则已经执行)

http://example.com/thisdoesntexist
http://example.com/thisdoesnt/exist

我希望这些由Apache的404错误处理,而不是由规则处理

http://example.com/favicon.ico
http://example.com/folder/myimage.png

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果http: //example.com/favicon.ico 并且http: //example.com/folder/myimage.png是不存在的文件,并且您希望它们由您的错误文档而不是规则传递,您可以将它们从规则中排除。

最简单的方法是在regex模式中排除.点字符。您可以使用^([^.]+)$匹配除点之外的任何uri字符。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)$ index.php [L]