我在这里碰壁了。据我所知,这应该有效,但事实并非如此。
我有一个本地开发地址,其中包含* .localhost的通配符子域,以及/ [0-9] / somestring的友好URL。我要做的是username.localhost/1/page
到localhost?pageId=1&username=username
。复杂的问题在于尝试同时获取username.localhost的主页以及各个页面,即username.localhost / 1 / page。两者都可以工作。
RewriteRule ^([0-9]+)/[a-zA-Z0-9\-\_\,\.]+$ - [S=1]
RewriteCond %{HTTP_HOST} !^www.* [NC]
RewriteCond %{HTTP_HOST} ^([^\.]+)\.localhost
RewriteRule ^index.php$ index.php?username=%1
RewriteRule ^([0-9]+)/[a-zA-Z0-9\-\_\,\.]+$ index.php?pageId=$1&username=%1
使用/ 1 /页面页面时,第一条规则意味着跳过匹配和跳过,但无法正确重写。但是,如果我删除前两个规则,它将重写/ 1 /页面页面就好了。
就好像它没有跳过,但是如果我将它改为S = 2,它会跳过这两个规则。哎呀。有什么想法吗?
答案 0 :(得分:1)
据我所知,实际上 正在做你期望它做的事情。只有在这样做之后,它才会在你的规则集上进行第二步,这会使事情变得混乱。发生的事情看起来更像这样:
http://username.localhost/1/page
1/page
与第一条规则匹配,S=1
已应用1/page
与第三条规则匹配,网址会重写为index.php?pageId=1&username=username
mod_rewrite
执行(到目前为止一切都很好,但是......)mod_rewrite
处理内部重定向,并再次开始处理规则index.php
与第一条规则不匹配,S=1
未应用index.php
与第二条规则匹配,网址会重写为index.php?username=username
mod_rewrite
检测到重定向循环并立即停止处理)有几种不同的方法可以解决这个问题,但我认为这里最简单的方法是确保文件不存在,然后将模式从最后一条规则滚动到前一条规则:< / p>
# 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
修改:上述版本还会捕获与您的网页模式不匹配的内容,其行为与index.php?username=username
类似,可能不需要。以下将避免这种情况,并且无论如何都更简洁:
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