简单的301重定向变量不起作用,为什么?

时间:2011-10-18 18:41:28

标签: apache .htaccess mod-rewrite redirect

这是我到目前为止所得到的。第一部分有效,但不是重定向。

我需要做些什么才能让它发挥作用?

RewriteEngine On
RewriteRule ^([^/\.]+)/?$ page.php?name=$1 [L]

RewriteRule ^page.php?name=([^/\.]+)/?$ /$1  [R=301,L] 

此外,如果我有多个这些规则,我是否仅将[L]留在最后一个规则上?

1 个答案:

答案 0 :(得分:1)

除了覆盖第二个规则的第一个规则之外,第二个规则也不起作用,因为您尝试匹配RewriteRule中的查询字符串。尝试这样的事情:

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} ^name=([^/.&]+)/?$
RewriteCond %{ENV:REDIRECT_LOOP} !1
RewriteRule ^page\.php$ /%1?  [NS,R=301,L]

RewriteRule ^([^/.]+)/?$ page.php?name=$1 [NS,QSA,E=LOOP:1]

(我添加了QSA标记,以便将/foobar?foo=bar之类的网址重写为/page.php?name=foobar&foo=bar,而不只是/page.php?name=foobar。如果您不想这样,请离开它出来了。)


注意:第二个RewriteCond用于保持第一个规则在第二个匹配后再次匹配。问题是,在.htaccess上下文中,mod_rewrite或多或少地起作用,好像所有规则都有PT标志,导致规则集在每次重写后从头开始重新运行,甚至内部那些。或者,to quote the documentation

  

“如果您在.htaccess文件或< Directory>部分中使用RewriteRule,那么了解规则的处理方式非常重要。简化形式是一旦规则处理完毕,重写的请求被传递回URL解析引擎以执行它可能的操作。可能的是,当处理重写的请求时,可能再次遇到.htaccess文件或< Directory>部分,因此规则集可能从一开始就再次运行。最常见的情况是,如果其中一条规则导致重定向(内部或外部)导致请求进程重新开始,就会发生这种情况。“

我正在使用的解决方法是在内部重写触发时使用E=LOOP:1设置自定义环境变量,并在执行外部重写之前检查它。请注意,当内部重写后请求处理重新开始时,Apache会将REDIRECT_预先设置为上一次传递期间设置的所有环境变量的名称,因此即使我们设置的变量仅命名为LOOP,我们需要检查的是REDIRECT_LOOP