Apache mod rewrite正在跳过第一个匹配规则

Apache mod rewrite正在跳过第一个匹配规则,apache,mod-rewrite,Apache,Mod Rewrite,我的.htaccess文件中有一个mod rewrite,其中有几个rewrite条目: RewriteRule ^/services/(\w+)$ controllers/$1.php [L] RewriteRule ^.*$ index.html [L] 每当我去它重定向到blah.com的索引,而不是匹配第一条规则,然后停止 另外:如果我将最后一条规则更改为: RewriteRule ^(\w+)$ index.html [L] 应用程序“工作”,只是在第一个/之后有其他路径时不工作

我的.htaccess文件中有一个mod rewrite,其中有几个rewrite条目:

RewriteRule ^/services/(\w+)$ controllers/$1.php [L]
RewriteRule ^.*$ index.html [L]
每当我去它重定向到blah.com的索引,而不是匹配第一条规则,然后停止

另外:如果我将最后一条规则更改为:

RewriteRule ^(\w+)$ index.html [L]
应用程序“工作”,只是在第一个/之后有其他路径时不工作

为什么会发生这种情况?

此规则(
RewriteRule^.*$index.html[L]
)过于通用,从htaccess文件调用时会将所有内容重写到索引页。从services/something重定向到services/controller/something.php后,再次调用根htaccess,第一个规则不适用(没有匹配),因此它转到第二个匹配的规则

我能想到三件事可以帮上忙:

1) 你试过使用结束标志吗

RewriteRule ^/services/(\w+)$ controllers/$1.php [END]
2) 在您的
services/controller
目录中放置一个htaccess,它将使您的根级别htaccess无效。例如,指令
发动机关闭时


3) 通过使用RewriteCond指令列表使重定向到索引规则更加具体。

如果在.htaccess中,则不应使用前导的
/
。只需匹配
^services/..
,因为它是在目录上下文中解析的,重写引擎不会将前导的
/
作为URI的一部分接收。@MichaelBerkowski我取出了前导的/并且它仍然重定向到索引如果您注释掉索引规则,它与服务匹配吗?@MichaelBerkowski yesboth 1和2为我工作。我试图让角度html5路由工作,但任何更具体的似乎都不起作用。