htaccess rewriterule无法正常工作

时间:2010-12-16 09:30:03

标签: .htaccess

RewriteEngine On
RewriteRule books/(.*)/(.*) php/booksByLanguage.php?lid=$2 
RewriteRule list_books/(.*)/(.*) php/listBooks.php?cat_id=$2


我正在使用htaccess来重写url(上面是我正在使用的代码)

问题是第二行(RewriteRule list_books/(.*)/(.*) php/listBooks.php?cat_id=$2)无法正常工作。即,


当我评论第一行(RewriteRule books/(.*)/(.*) php/booksByLanguage.php?lid=$2)时,第二行将正常工作

以下代码可以正常使用

 RewriteEngine On
    #RewriteRule books/(.*)/(.*) php/booksByLanguage.php?lid=$2 
    RewriteRule list_books/(.*)/(.*) php/listBooks.php?cat_id=$2


我希望这两条规则都适合我。

2 个答案:

答案 0 :(得分:2)

尝试添加开始和结束标记^ $。

  

RewriteRule ^ / books /(。)/(。)$   PHP / booksByLanguage.php?盖= $ 16

这样就不会为list_books匹配触发你的第一条规则。

答案 1 :(得分:2)

问题是:你没有定义以^开头的行。 因此,如果第二条规则也匹配,则第一条规则将始终匹配。 因为它只需要匹配字符串。例如:

books.*将与booksshelf以及mybookshelf匹配  ^books.*仅匹配bookshelf

RewriteEngine On
RewriteRule list_books/(.+)/(.+)$ php/listBooks.php?cat_id=$2 [L]
RewriteRule books/(.+)/(.+)$ php/booksByLanguage.php?lid=$2

这应该有用但不漂亮。 事情是,当第一个规则(在更新的代码中)匹配时,第二个规则也将匹配。但不是相反。

所以我把它放好并设置了最后一个开关[L],以便之后不再执行其他规则。

然而这是错误的方式!

你应该定义你的重写规则,使它们只匹配你想要的!

我不知道你的结构,所以这可能不起作用,但我可以想象如下:

RewriteEngine On
RewriteRule ^/list_books/(.+)/(.+)$ php/listBooks.php?cat_id=$2
RewriteRule ^/books/(.+)/(.+)$ php/booksByLanguage.php?lid=$2

如果这是你的根级别,你需要包括起始斜杠,作为请求的一部分,但我不能告诉你不知道你的结构。