从htaccess重写规则中排除文件

时间:2011-12-22 21:08:27

标签: php .htaccess bootstrapping

我的PHP应用程序中有一个htaccess重写设置,用于通过bootstrapper文件路由文件。从本质上讲,目标是获取一个URL,例如www.domain.com/view/key/value/key/value,其中视图将相应地路由,并且键/值对将通过我在引导程序中编写的函数可用对观点。一切都运作良好......

也就是说,直到我开始做ajax-y的东西。我通过单个文件ajaxDispatcher.php路由我的所有ajax查询。当我这样做时,htaccess(正确)捕获了请求并使用我的引导程序不适当地路由它。同样,它试图路由不需要的文件,如.ico,.css等。

我想出了文件扩展路由异常,但是,我无法让.htaccess忽略单个文件ajaxDispatcher.php的重写规则。这是我的代码所在的位置:

 RewriteEngine On
 RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteRule ^/ajaxDispatcher.php$ $0 [L]
 RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php?route=$1 [L]

如何让.htaccess忽略仅针对ajaxDispatcher的路由规则?

2 个答案:

答案 0 :(得分:5)

您应该在RewriteCond块上移动新规则:

RewriteRule ^/?ajaxDispatcher.php$ - [L]

否则RewriteConditions不再包含RewriteRule扩展,我认为它们是有意的。

另一种选择是将其转换为另一个RewriteCond:

RewriteCond %{SCRIPT_NAME}  !ajaxDispatcher

或者将其作为断言注入最终的RewriteRule (?!ajaxDispatcher.php)

订购事项最好在Serverfault上解释:https://serverfault.com/questions/214512/everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-as

答案 1 :(得分:2)

如果您从显示的代码中删除了ajaxDispatcher.php行,那么它应该有效 - 由于!-f!-d规则,对实际存在的文件的请求将从重写ruke。