Apache RewriteRule和跳过逻辑

时间:2010-08-23 14:40:31

标签: apache mod-rewrite

我在这里碰壁了。据我所知,这应该有效,但事实并非如此。

我有一个本地开发地址,其中包含* .localhost的通配符子域,以及/ [0-9] / somestring的友好URL。我要做的是username.localhost/1/pagelocalhost?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,它会跳过这两个规则。哎呀。有什么想法吗?

1 个答案:

答案 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