Apache mod_rewrite问题

时间:2011-11-26 15:11:36

标签: apache mod-rewrite

我正在尝试使用此

将每个请求发送到www.example.com/user/www.example.com/user.php?id=0
RewriteRule ^user/$ user.php?id=0

基本上,如果有人在没有用户ID的情况下访问www.example.com/user/,则该网站将默认为id = 0

然而,当我输入www.example.com/user/时,Apache似乎只是提供了user.php文件,完全忽略了RewriteRule。对于为什么会发生这种情况的任何想法?

谢谢。

我应该提一下,只有当我使用URL 中的相同的单词作为php文件的名称时才会发生这种情况。例如,如果我使用

RewriteRule ^yes/$ user.php?id=0

转到www.example.com/yes/会很好地应用RewriteRule。 所以似乎Apache查找具有该名称的文件并忽略RewriteRule。 不,添加[L]标志没有帮助。

这是我的.htaccess:

RewriteEngine On
RewriteRule ^user/$ user.php?id=0
RewriteRule ^user/([0-9]+)$ user.php?id=$1 

2 个答案:

答案 0 :(得分:6)

试试这个:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^user/$ user.php?id=0 [L,NC,QSA]
RewriteRule ^user/([0-9]+)/?$ user.php?id=$1 [L,NC,QSA]

[L]标志使mod_rewrite停止处理规则集。在大多数情况下,这意味着如果规则匹配,则不会处理其他规则。这对应于Perl中的最后一个命令,或C中的break命令。使用此标志指示应立即应用当前规则而不考虑进一步的规则。

来自:http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l

答案 1 :(得分:0)

我认为您的重写规则顺序错误,并且您没有使用[L]标志告诉apache在规则匹配时不再运行任何规则。您也可以使用+运算符代替*来匹配第二条规则中至少一个数字:

RewriteRule ^user/$ user.php?id=0 [L]
RewriteRule ^user/([0-9]+)$ user.php?id=$1 [L]