Apache mod_rewrite规则不适用于不同的页面

时间:2011-08-16 11:45:20

标签: mod-rewrite apache2

我在.htaccess文件中有一个关于apache2的重写规则,它适用于posts.php页面。

mysite.com/post.php?id_name=this-is-the-title-of-my-site 

成为

mysite.com/this-is-the-title-of-my-site

我想对cats.php页面使用相同的规则,以便

mysite.com/cats.php?cat_label=articles

变为

mysite.com/articles

我使用了相同的规则并更改了文件名和参数,但cats.php页面的规则似乎失败并被posts.php规则覆盖

我不愿意,但我不介意改变结构成为

mysite.com/cats/articles

这是我目前正在使用的.htaccess文件

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id_name=$1 [L,QSA]


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ cats.php?cat_label=$1 [L,QSA]

非常感谢所有帮助

1 个答案:

答案 0 :(得分:1)

标志[L]表示“最后”,因为在匹配该规则时,它是最后一次测试的重写规则。您需要一种方法来区分两种类型的重定向。这有两种方法可以做到:

(1)在所有帖子名称中都有破折号,但在您的类别中没有破折号,因此您给出的两个示例都按照给定的方式工作:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^-]+)$ cats.php?cat_label=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id_name=$1 [L,QSA]

(2)为类别添加目录,以便不会发生任何神奇的角色,这可能会导致错误。您已经在上面遇到过这种可能性。以下是它的外观:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^cats/(.*)$ cats.php?cat_label=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ post.php?id_name=$1 [L,QSA]

在这两种情况下,我们首先匹配更具体的版本,将它们标记为[L] ast。然后我们在最后有广泛的收获。

相关问题