在这里,我坚持使用我的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版本。答案 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
将上述规则更改为:
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]