我有一个简单的.htaccess文件,其中包含以下内容。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
我想添加此规则。
RewriteRule ^p$ index.php?p=
我尝试在下面这样做,但它不起作用。似乎两条规则都在运行。我尝试了几个不同的旗帜,再次没有运气。有人可以告诉我如何使这个工作。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p$ index.php?p=
RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
答案 0 :(得分:35)
您必须添加[L]
标志才能在一次匹配时停止阅读规则:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^p$ index.php?p= [L]
RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>
提醒RewriteRule
标志:
摘自此(非常)完整的帖子: https://serverfault.com/questions/214512/everything-you-ever-wanted-to-know-about-mod-rewrite-rules-but-were-afraid-to-as
答案 1 :(得分:6)
首先你应该知道重写条件只影响下面的重写规则,你在重写条件和重写规则之间添加了新规则,现在它们只影响你的新规则而不是旧规则(什么你有代码的是,只有当目标网址不是文件或目录时才会执行重写规则),所以如果你希望旧规则仍然受重写条件的影响,你必须添加新规则在重写条件之前。
对于你的问题,我认为samsamX已经回答足够了(通过添加[L]标志来修复)。
最后你应该有这样的东西:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^p$ index.php?p= [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?s=$1 [L]
</IfModule>