我在.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]
非常感谢所有帮助
答案 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。然后我们在最后有广泛的收获。