什么是检测和重定向SNI支持的浏览器的最有效的代码?
说,我有一个网站mywebsite.com
,使用Apache Httpd托管。 现在我想要的是,只要有任何用户键入mywebsite.com
或www.mywebsite.com
并且浏览器支持SNI,那么它应该重定向到https://www.mywebsite.com
否则重定向到http://www.mywebsite.com
。
那么,实现它的最有效方法是什么?
下面的代码应该可以工作
Options -Indexes +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^mywebsite.com$
RewriteCond %{HTTPS} (on|off)
RewriteRule ^(.*)$ http://www.mywebsite.com/$1 [R=302,L]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_USER_AGENT} !MSIEs6
RewriteCond %{HTTP_USER_AGENT} !WindowssNTs5
RewriteCond %{HTTP_USER_AGENT} !^(.*.symbian.*) [NC]
RewriteCond %{HTTP_USER_AGENT} !^(.*.blackberry.*) [NC]
RewriteRule ^(.*)$ https://www.mywebsite.com/$1 [R=302,L]
这里我们忽略了大多数不支持SNI的浏览器,因此只有http版本才会被加载。
更好的解决方案是
#Test if new browser and if so redirect to https
#new browser is not MSIE 5-8, not Android 0-3,
#not any symbian and not any blackbery
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_USER_AGENT} !MSIE [5-8] [NC]
RewriteCond %{HTTP_USER_AGENT} !Android.*(Mobile)? [0-3] [NC]
RewriteCond %{HTTP_USER_AGENT} !^(.*.symbian.*) [NC]
RewriteCond %{HTTP_USER_AGENT} !^(.*.blackberry.*) [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
这忽略了MSIE 5-8,它排除了XP上的所有IE,加上VISTA上的一些工作。 但允许XP与铬,火狐,歌剧,所有这些都支持XP上的SNI。 这至少可以让XP用户使用https。 同样,它假定所有的Symbian,blackbery都没有sni。 而那个android 3呢(我知道哪些平板电脑,手机需要4个)。
为了不同的解决方案,你可以有
#Could use this to set $_SERVER['SSL_TLS_SNI'] for php
SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI}
这会将$ _SERVER ['SSL_TLS_SNI']设置为%{SSL:SSL_TLS_SNI}(是的可能是更好的代码)或域名。 如果你知道Apache返回的默认证书并有权访问该域,那么在其他域中,你可以让PHP做一个测试https到默认域,然后检查$ _SERVER ['SSL_TLS_SNI']以测试SNI之前去https。
请注意,如果非sni浏览器没有https访问需要sni的站点,则无法避免出现错误消息。 你能做的最好的是
# Test if SNI will work and if not redirect to too old browser page
RewriteCond %{HTTPS} on
RewriteCond %{SSL:SSL_TLS_SNI} =""
RewriteRule ^ http://www.example.com/too-old-browser [L,R=307]
用户需要接受浏览器错误并继续访问网站,之后他将被重定向到http和错误页面。
这是我根据上面的答案使用的。
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=302]
RewriteCond %{HTTP_USER_AGENT} !MSIEs7
RewriteCond %{HTTP_USER_AGENT} !WindowssNTs5
RewriteCond %{HTTP_USER_AGENT} !Android.*(Mobile)? [0-3] [NC]
RewriteCond %{HTTP_USER_AGENT} !^(.*.symbian.*) [NC]
RewriteCond %{HTTP_USER_AGENT} !^(.*.blackberry.*) [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
这将首先重写为http,如果未列出useragent,则重写为https。 我不知道这是否有不好,有两个重写,但我相信谷歌和其他相关的机器人更喜欢索引https。 这样做达到了(我认为:)
我这样做的倒退方式,但它似乎工作。 我相信你的更好的黑名单浏览器并将它们导航到HTTP而不是将浏览器列入白名单,因为添加的方式太多了。
每个网站是不同的,并根据安全性上述可能是一个选项。
请让我知道你的想法。
链接地址: http://www.djcxy.com/p/79469.html上一篇: What is the most efficient code to detect and redirect SNI supported browsers?
下一篇: How can I make this 100% height + column overflow layout work in Firefox and IE?