据我所知,事实上
是
做你期望它做的。只有这样做之后,它才会在你的规则设置上有第二个步骤,这会把事情搞砸。发生的事情看起来更具体如下:
-
请求到
http://username.localhost/1/page
被制成
-
输入
1/page
符合第一条规则,
S=1
应用
-
输入
1页
与第三条规则匹配,URL重写为
index.php?pageId=1&username=username
-
内部重定向由执行
mod_rewrite
(到目前为止都很好,但是…)
-
MODY重写
处理内部重定向,并重新开始处理规则
-
输入
index.php
与第一条规则不匹配,
S=1
未应用
-
输入
索引文件
与第二条规则匹配,URL重写为
index.php?username=username
-
(内部重定向再次发生,执行相同的重写,但是
MODY重写
检测重定向循环并立即停止处理)
有几种不同的方法可以解决这个问题,但我认为这里最简单的方法是确保文件不存在,然后将模式从上一个规则滚动到前一个规则的条件中:
# Make sure we haven't rewritten to a file yet (the "directory" gets processed
# before DirectoryIndex index.php is applied)
RewriteCond %{REQUEST_FILENAME} !-f
# Check that the input doesn't match the pattern we want handled later
RewriteCond $0 !^([0-9]+)/[a-zA-Z0-9_,.-]+$
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost
RewriteRule ^.*$ index.php?username=%1
RewriteRule ^([0-9]+)/[a-zA-Z0-9_,.-]+$ index.php?pageId=$1&username=%1
编辑
:上面的版本还捕获了与您的页面模式不匹配的内容,并表现得像
索引?用户名=用户名
可能不需要。以下内容将避免这种情况,而且更为简洁:
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost
RewriteRule ^$ index.php?username=%1
RewriteRule ^([0-9]+)/[a-zA-Z0-9_,.-]+$ index.php?pageId=$1&username=%1