为什么这个htaccess代码导致重定向循环?

时间:2014-06-01 14:59:43

标签: apache .htaccess

在这里,我坚持使用我的htaccess代码。我一直试图弄清楚过去11个小时为什么我会得到以下代码的重定向循环。

Options -Indexes +FollowSymLinks
RewriteEngine on

#Check for no www or www
RewriteCond %{HTTP_HOST} ^dummysite.com$ [or]
RewriteCond %{HTTP_HOST} ^www.dummysite.com$ [NC]
RewriteRule . - [E=FIRSTPART:true]

# IE 6
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6

RewriteCond  %{ENV:FIRSTPART}  true
RewriteRule ^(.*)$ https://www.dummysite.com/$1 [R=302,L]

为什么上面的代码会导致重定向循环?

编辑:我真正想要的是,如果用户来自IE6,那么他应该被重定向到带有www作为前缀的http版本,无论他是否在网址中输入www。另一方面,如果用户来自任何其他浏览器,则无论是否在网址中键入www,都应将其重定向到以www为前缀的https版本。

4 个答案:

答案 0 :(得分:2)

以下代码可以解决您的问题。

RewriteCond %{HTTP_HOST} ^dummysite.com$
RewriteCond %{HTTPS} (on|off)
RewriteRule ^(.*)$ http://www.dummysite.com/$1 [R=302,L]

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteRule ^(.*)$ https://www.dummysite.com/$1 [R=302,L]

首先设置 www 版本 url (如果网址在前缀中没有www,则会跳过第一次重写),然后从< strong> http 到 https

答案 1 :(得分:0)

如果它不是IE6,那么阻止该规则反复应用(引起重定向循环)的原因是什么?

你不应该检查第一部分是不是真的吗?

RewriteCond  %{ENV:FIRSTPART}  !true

编辑:因为您似乎想要重定向到&#34; www&#34;无论MSIE6是什么,你必须只在&#34; www&#34;缺少。否则,它有一个&#34; www&#34;,您重定向到完全相同的域,其中包含&#34; www&#34;,然后再重定向等等。

将上述规则更改为:

RewriteCond %{HTTP_USER_AGENT} MSIE\s6
RewriteCond %{HTTP_HOST} !^www [NC,OR]
RewriteCond %{HTTPS} on
RewriteRule ^(.*)$ http://www.dummysite.com/$1 [R=302,L]

否则

RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteCond  %{ENV:FIRSTPART}  true
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.dummysite.com/$1 [R=302,L]

答案 2 :(得分:0)

让我们看看当你去dummysite.com/foo时会发生什么。 RewriteCond %{HTTP_HOST} ^dummysite.com$为真,并且由于或者标志,跳过第二个条件。该规则将环境变量设置为true。然后检查使用者。如果那不是IE6(或假装它是IE6的客户端),并且该环境变量为true,则重定向到https://www.dummysite.com/foo。太好了!

但现在发生了什么。客户端再次执行该请求。 RewriteCond %{HTTP_HOST} ^dummysite.com$现在为false,但由于or-flag,它将检查第二个条件。 RewriteCond %{HTTP_HOST} ^www.dummysite.com$ [NC]现在为true,因此它设置了环境变量。它重定向到相同的URL。遍历,结束,结束,结束,直到客户决定不再做任何请求。

您或者似乎想要将没有www的域重定向到域名为www的域名,这可能是圆顶的:

RewriteCond %{HTTP_HOST} ^dummysite.com$
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteRule ^(.*)$ https://www.dummysite.com/$1 [R=302,L]

或者您想将http重定向到https,这可以通过以下方式完成:

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

编辑:

如果您想同时做这两件事,请分两步完成。首先&#34;只是&#34;如果有必要,重定向到www版本,同时保持协议相同。然后,在第二步中,重定向到适当的协议。

RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTPS}s (on(s)|off)
RewriteRule ^ http%2://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_USER_AGENT} MSIE\s6
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

答案 3 :(得分:0)

RewriteCond %{HTTP_USER_AGENT} MSIE\s6
RewriteCond %{HTTP_HOST} ^dummysite\.com$ [OR,NC]
RewriteCond %{HTTPS} =on
RewriteRule ^ http://www.dummysite.com%{REQUEST_URI} [R]

RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteCond %{HTTP_HOST} ^dummysite\.com$ [OR,NC]
RewriteCond %{HTTPS} =off
RewriteRule ^ https://www.dummysite.com%{REQUEST_URI} [R]

或者这个,因为我不确定RewriteCond集合和/或优先级

RewriteCond %{HTTP_USER_AGENT} MSIE\s6
RewriteCond %{HTTP_HOST} ^dummysite\.com$ [OR,NC]
RewriteCond %{HTTP_USER_AGENT} MSIE\s6
RewriteCond %{HTTPS} =on
RewriteRule ^ http://www.dummysite.com%{REQUEST_URI} [R]

RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteCond %{HTTP_HOST} ^dummysite\.com$ [OR,NC]
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
RewriteCond %{HTTPS} =off
RewriteRule ^ https://www.dummysite.com%{REQUEST_URI} [R]