我的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
提前致谢。
答案 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]