Skip to content

Instantly share code, notes, and snippets.

@59RY 59RY/SNI_RegExp.md
Last active Jun 22, 2018

Embed
What would you like to do?
SNI SSL(HTTPS)を使いたいけど Android 2.X とか古いブラウザもあるから SNI 対応ブラウザだけ SSL 接続させる正規表現

SNI SSL(HTTPS)を使いたいけど Android 2.X とか古いブラウザもあるから SNI 対応ブラウザだけ SSL 接続させる正規表現

↑タイトル長えwwwww

Cloudflare で SNI SSL をやりたくなって、需要あるかなと思ってのメモ。

正規表現

(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|Android.*(Mobile)?\ [0-2]\.)

ガラケーにも対応させる場合

(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|UP\.Browser/|DoCoMo/\d\.|SoftBank/\d\.|Android.*(Mobile)?\ [0-2]\.)

ガラケーって基本的に SNI の SSL をサポートされていないからな。

bot や クローラー を HTTPS でアクセスさせない場合

(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|UP\.Browser/|DoCoMo/\d\.|SoftBank/\d\.|Android.*(Mobile)?\ [0-2]\.|bot|Bot|Y!J\-|Crawler|Baidu|Yeti|Slurp)

基本的な bot・クローラーに対してだけの対処。

SNI 非対応ブラウザを考えて、検索結果は普通に HTTP だけど SNI 対応ブラウザだけ HTTPS させたい場合に。

逆に bot 類のを取れば検索結果は HTTPS だし、若干検索順位で優位だけど、SNI 非対応ブラウザで1回警告が出る(スクショ)からな。。。

Google や Yahoo! JAPAN(Google と同じだが一応)、Yahoo! USA、bing(bingbot って名前だから bot で弾ける)、そのほかメジャーなキーワードで弾ければいいかな程度で。

書き方

Cloudflare Flexible じゃない(VPSなど、サーバー側で SSL が使える)場合。

.htaccess の書き方(例)###

# HTTP(S) Stuff
# Redirect all users except doesn't support modern browser, nor Japan cell-phone to HTTPS
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{HTTP_USER_AGENT} !(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|UP\.Browser/|DoCoMo/\d\.|SoftBank/\d\.|Android.*(Mobile)?\ [0-2]\.)
RewriteRule (.*) https://%{HTTP_HOST}/$1 [L]

web.config での書き方(例)

  • 既存の web.config があればそれにくっつける形で。
  • XML ではなく、IIS マネージャーからやる場合はこの XML を参考に適宜。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<system.webServer>
		<rewrite>
			<rules>
				<rule name="HTTP → HTTPS (if SNI OK)" stopProcessing="false">
					<match url="^(.*)$" />
					<conditions>
						<add input="{HTTPS}" pattern="off" />
						<add input="{HTTP_USER_AGENT}" pattern="(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|Android.*(Mobile)?\ [0-2]\.)" negate="true" />
					</conditions>
					<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
				</rule>
				<rule name="HTTPS → HTTP (if SNI NG)" stopProcessing="false">
					<match url="^(.*)$" />
					<conditions>
						<add input="{HTTPS}" pattern="on" />
						<add input="{HTTP_USER_AGENT}" pattern="(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|Android.*(Mobile)?\ [0-2]\.)" negate="false" />
					</conditions>
					<action type="Redirect" url="http://{HTTP_HOST}/{R:1}" />
				</rule>
			</rules>
		</rewrite>
	</system.webServer>
</configuration>

Cloudflare で Flexible SSL をする場合

レンタルサーバー+レン鯖SSLでお金を掛けたくない人向けだね。↑のやつだと使えない!

.htaccess の場合

# HTTP(S) Stuff
# Redirect all users except doesn't support modern browser, nor Japan cell-phone to HTTPS
RewriteCond %{HTTP_CF_VISITOR} !^\{"scheme":"https"\}$
RewriteCond %{CF_VISITOR} !^\{"scheme":"https"\}$
RewriteCond %{HTTP_USER_AGENT} !(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|UP\.Browser/|DoCoMo/\d\.|SoftBank/\d\.|Android.*(Mobile)?\ [0-2]\.)
RewriteRule (.*) https://%{HTTP_HOST}/$1 [L]

web.config の場合

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<system.webServer>
		<rewrite>
			<rules>
				<rule name="Cloudflare SNI 1" stopProcessing="false">
					<match url="^(.*)$" />
					<conditions>
						<add input="{HTTP_CF_VISITOR}" pattern="^\{"scheme":"https"\}$" negate="true" />
						<add input="{CF_VISITOR}" pattern="^\{"scheme":"https"\}$" negate="true" />
						<add input="{HTTP_USER_AGENT}" pattern="(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|Android.*(Mobile)?\ [0-2]\.)" negate="true" />
					</conditions>
					<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
				</rule>
				<rule name="Cloudflare SNI 2" stopProcessing="false">
					<match url="^(.*)$" />
					<conditions>
						<add input="{HTTP_CF_VISITOR}" pattern="^\{"scheme":"https"\}$" negate="false" />
						<add input="{CF_VISITOR}" pattern="^\{"scheme":"https"\}$" negate="false" />
						<add input="{HTTP_USER_AGENT}" pattern="(MSIE [1-6]\.|MSIE [78]\.\d\; Windows NT 5\.|Android.*(Mobile)?\ [0-2]\.)" negate="false" />
					</conditions>
					<action type="Redirect" url="http://{HTTP_HOST}/{R:1}" />
				</rule>
			</rules>
		</rewrite>
	</system.webServer>
</configuration>

備考

  • CF_VISITORHTTP_CF_VISITOR 結局どっちかは未検証のためわからない。。
    • 分かったら誰かコメントお願いします←
  • 冗長性を考えると{"scheme":"https"} は \{(.*)"scheme":((.*){0}| )"https"((.*){0}|;(.*))\} になるのk・・・いやなんでもないw - 考えすぎかも。

余談:このメモについて

  • 先日Cloudflareが SNI の SSL を無料で提供されるという話を聞いて
  • 『え、マジ!?やったー!じゃあ早速サイトを全部 SSL 化・・・したいところだが』
  • 『古い IE は切り捨てられるとしても、Android 2.X(SNI 非対応)使っている人も少なくないんだよなー・・・』
  • 『うーん、せめて SNI 対応ブラウザだけでも SSL アクセスさせられないか』

という経緯があってこのメモができたのだw

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.