RewriteRule之后的Apache重定向

时间:2012-12-12 19:25:17

标签: apache .htaccess mod-rewrite redirect rewrite

我正在尝试重定向到该网站的“移动”版本,完成以下操作:

RewriteCond %{HTTP_USER_AGENT} "ipad|iphone|ipod" [NC]
RewriteCond %{HTTP_COOKIE} !^.*mobile.*$ [NC]
RewriteRule ^$ /?m=t [L,R=302,co=mobile:true:.domain.com]

RewriteCond %{HTTP_USER_AGENT} "ipad|iphone|ipod" [NC]
RewriteCond %{HTTP_COOKIE}   ^.*mobile=true.*$ [NC]
RewriteCond %{QUERY_STRING} !(^|&)m=t(&|$) [NC]
RewriteRule ^$ /?m=t [L,R=302,co=mobile:true:.domain.com,QSA]

现在这适用于root。 但由于该网站严重依赖于重写,如果我修改

RewriteRule ^$ /?m=t [L,R=302,co=mobile:true:.domain.com,QSA]

RewriteRule ^(.*)$ /$1?m=t [L,R=302,co=mobile:true:.domain.com,QSA]

它会给我正确的重定向,但没有任何先前的重写。

所以,如果我之前说过重写

RewriteRule ^product/shimano$ /index.php?product_cat=shimano [L]

修改后的行会给我/index.php?m=t&product_cat=shimano而不是/ product / shimano?m = t

我错过了什么?我一直试图解决这个问题。

1 个答案:

答案 0 :(得分:0)

首先尝试重定向,然后重写。也就是说,将这些移动检查规则放在重写之前。

这样,如果它是移动的,并且m = t不存在,它将执行302重定向并添加m = t。那将再次通过,跳过这些规则(因为m = t就在那里),并继续正常的重写。

我不完全确定上面的第一套规则。他们可能还需要来自第二组的那一行,即查询字符串检查m = t,以避免无限循环。基本上,如果它已经有m = t,那么它就不会再这样做了。