◆ 有名サイト調べてみた
◆ 別ドメインにリダイレクトされたりもしたけど 67 中 53 が https へリダイレクト
◆ https にリダイレクトしなくても何らかのレスポンスがあるので困らない
◆ リダイレクトなしで https のみのサイトだとタイムアウトするまでロード続く

https のサイトが増えてきていますが http にアクセスしても https のほうにリダイレクトするべきか という話です
もともと http でやっていたなら古い方をお気に入り登録やリンクされてる場合などもありますし 普通はリダイレクトにするでしょう
https 対応したら急に http で繋がらなくなるなんてサービスとしてどうかと思います
管理してる側もすでに http でサイトを公開していたわけなのでリダイレクト設定するのも比較的簡単です

では 新しくサイトを作るときに http も接続可能にしてリダイレクトするようにしたほうがいいのでしょうか
私はするべきだと思ってます
これまでインターネットは http がメインだったわけですし つい http と打ってしまう人やドメインだけなら自動で http として開くツールもあります
パソコンに詳しくなくてインターネットなんて動画見えればいいくらいな人たちからすると http も https もどうでもいいわけです
インターネットは http だと思ってる人だっています
そんなユーザも含めて使いやすくするなら断然リダイレクトするべきです

リダイレクト対応してなかったページに http でアクセスしていてつながらなかったときはサービス落ちてるのかなと思ったほどです
http がなくて https があるってわかってるなら自動で切り替わるくらい当たり前の動きですし URL の違いが s のあるなしくらいなので URL の間違いにも気づきづらいです
何度か経験あってもたまに躓いてます


そんなリダイレクトですが リダイレクト不要と言ってる人がいました
余計なことしたくない・使わないポートあけるなんてセキュリティがどうこう・そもそも URL 手打ちなんてありえないから困らない という主張のようです
リダイレクトしないなんて一般公開しないサービスなのかと思ったら普通に公開するサービスのことでした
ドメインまでなら手打ちする人いると思うのですけどね
私はこのブログ開く時ググるより直接ドメインを入力してますし
さらには世間のサービスでリダイレクトしてるのそんなにある?なんてことも言っていました
ほとんどがしてると思うけどな

調べてみた

どれくらいがしてるのか単純に気になったので調べてみました
とりあえず有名なサイトを対象にしようとググってでてきたこのページに人気ウェブサイトのリストがあったのでここのドメインを使います
https://en.wikipedia.org/wiki/List_of_most_popular_websites

リダイレクトの流れを調べる楽な方法が思いつかなかったのでとりあえず nodejs で作ってみました

const http = require("http")
const https = require("https")
const url = require("url")

async function sleep(ms){
return new Promise(s => setTimeout(s, ms))
}

async function request(request_url, opt) {
return new Promise((s, f) => {
const parsed = url.parse(request_url)
const option = {
hostname: parsed.hostname,
path: parsed.path,
port: parsed.port,
headers: {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
},
...opt
}
const req_module = parsed.protocol === "http:" ? http : https
const req = req_module.request(option, res => {
s(res)
})
req.on("error", err => {
f(err)
})
req.end()
})
}

async function getResponseHeader(request_url, opt) {
const res = await request(request_url, {...opt, method: "HEAD"})
console.log(res.headers)
// if HEAD method is not allowed, use GET method
if (res.statusCode === 405) {
console.log(request_url + " HEAD method not allowed")
const subres = await request(request_url, {...opt, method: "GET"})
return subres.headers
} else {
return res.headers
}
}

async function detectRedirect(request_url, max_redirect = 10) {
return recur(request_url)

async function recur(req_url, route = []) {
const urls = [...route, req_url]
try {
const headers = await getResponseHeader(req_url)
if ("location" in headers) {
const location = url.resolve(req_url, headers.location)
if (urls.includes(location)) {
return [...urls, { error: "RedirectLoop", url: location }]
} else if (max_redirect === urls.length) {
return [...urls, { error: "ExceedMaxRedirect" }]
} else {
return recur(location, urls)
}
} else {
return urls
}
} catch (err) {
return [...route, { error: "NetworkError", url: req_url }]
}
}
}

!async function () {
// 2018-03-11 https://en.wikipedia.org/wiki/List_of_most_popular_websites
const domains = [
"google.com",
"youtube.com",
"facebook.com",
"baidu.com",
"wikipedia.org",
"reddit.com",
"yahoo.com",
"google.co.in",
"qq.com",
"amazon.com",
"taobao.com",
"twitter.com",
"tmall.com",
"google.co.jp",
"vk.com",
"instagram.com",
"live.com",
"sohu.com",
"sina.com.cn",
"jd.com",
"weibo.com",
"360.cn",
"google.de",
"google.co.uk",
"google.com.br",
"google.fr",
"google.ru",
"yandex.ru",
"netflix.com",
"linkedin.com",
"twitch.tv",
"google.it",
"list.tmall.com",
"t.co",
"google.com.hk",
"pornhub.com",
"google.es",
"alipay.com",
"xvideos.com",
"google.ca",
"yahoo.co.jp",
"ebay.com",
"google.com.mx",
"microsoft.com",
"bing.com",
"ok.ru",
"imgur.com",
"bongacams.com",
"hao123.com",
"aliexpress.com",
"mail.ru",
"google.com.tr",
"google.com.au",
"whatsapp.com",
"google.pl",
"google.co.id",
"xhamster.com",
"google.com.ar",
"xnxx.com",
"google.co.th",
"Naver.com",
"sogou.com",
"samsung.com",
"accuweather.com",
"goo.gl",
"sm.cn",
"googleweblight.com",
]

for (const domain of domains) {
console.log(await detectRedirect("http://" + domain))
await sleep(1000)
}
}()

1 つの配列でリダイレクトの URL の変化がわかるようになっています
結果はこうなりました
[ 'http://google.com',
'http://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=KcukWo3AEYjf8AfX_ZqIDw',
'https://www.google.co.jp/?gfe_rd=cr&dcr=0&ei=KcukWo3AEYjf8AfX_ZqIDw&gws_rd=ssl' ]
[ 'http://youtube.com',
'https://youtube.com/',
'https://www.youtube.com/' ]
[ 'http://facebook.com',
'https://facebook.com/',
'https://www.facebook.com/' ]
[ 'http://baidu.com' ]
[ 'http://wikipedia.org',
'https://wikipedia.org/',
'https://www.wikipedia.org/' ]
[ 'http://reddit.com', 'https://www.reddit.com/' ]
[ 'http://yahoo.com', 'https://www.yahoo.com/' ]
[ 'http://google.co.in',
'http://www.google.co.in/',
'https://www.google.co.in/?gws_rd=ssl' ]
[ 'http://qq.com',
{ error: 'NetworkError', url: 'http://www.qq.com/' } ]
https://www.amazon.com/ HEAD method not allowed
[ 'http://amazon.com',
'https://amazon.com/',
'https://www.amazon.com/' ]
[ 'http://taobao.com',
'http://www.taobao.com/',
'https://www.taobao.com/',
'https://world.taobao.com/' ]
[ 'http://twitter.com', 'https://twitter.com/' ]
[ 'http://tmall.com',
'http://www.tmall.com/',
'https://www.tmall.com/' ]
[ 'http://google.co.jp',
'http://www.google.co.jp/',
'https://www.google.co.jp/?gws_rd=ssl' ]
[ 'http://vk.com' ]
[ 'http://instagram.com',
'https://instagram.com/',
'https://www.instagram.com/' ]
http://live.com HEAD method not allowed
[ 'http://live.com', 'https://outlook.live.com/owa/' ]
[ 'http://sohu.com', 'http://www.sohu.com/' ]
[ 'http://sina.com.cn', 'http://www.sina.com.cn/' ]
[ 'http://jd.com',
'http://www.jd.com/',
'https://global.jd.com/' ]
[ 'http://weibo.com',
'https://weibo.com/',
'http://jp.weibo.com/' ]
[ 'http://360.cn', 'https://www.360.cn/' ]
[ 'http://google.de',
'http://www.google.de/',
'https://www.google.de/?gws_rd=ssl' ]
[ 'http://google.co.uk',
'http://www.google.co.uk/',
'https://www.google.co.uk/?gws_rd=ssl' ]
[ 'http://google.com.br',
'http://www.google.com.br/',
'https://www.google.com.br/?gws_rd=ssl' ]
[ 'http://google.fr',
'http://www.google.fr/',
'https://www.google.fr/?gws_rd=ssl' ]
[ 'http://google.ru',
'http://www.google.ru/',
'https://www.google.ru/?gws_rd=ssl' ]
[ 'http://yandex.ru', 'https://yandex.ru/' ]
http://netflix.com HEAD method not allowed
https://www.netflix.com/ HEAD method not allowed
[ 'http://netflix.com',
'https://www.netflix.com/',
'https://www.netflix.com/jp-en/' ]
[ 'http://linkedin.com',
'https://www.linkedin.com/',
'http://www.linkedin.com/',
{ error: 'RedirectLoop', url: 'https://www.linkedin.com/' } ]
[ 'http://twitch.tv',
'http://www.twitch.tv/',
'https://www.twitch.tv/' ]
[ 'http://google.it',
'http://www.google.it/',
'https://www.google.it/?gws_rd=ssl' ]
[ 'http://list.tmall.com',
'https://list.tmall.com/',
'http://www.tmall.com/',
'https://www.tmall.com/' ]
[ 'http://t.co' ]
[ 'http://google.com.hk',
'http://www.google.com.hk/',
'https://www.google.com.hk/?gws_rd=ssl' ]
[ 'http://pornhub.com', 'https://www.pornhub.com/' ]
[ 'http://google.es',
'http://www.google.es/',
'https://www.google.es/?gws_rd=ssl' ]
[ 'http://alipay.com' ]
[ 'http://xvideos.com', 'http://www.xvideos.com/' ]
[ 'http://google.ca',
'http://www.google.ca/',
'https://www.google.ca/?gws_rd=ssl' ]
[ 'http://yahoo.co.jp', 'https://www.yahoo.co.jp/' ]
[ 'http://ebay.com', 'https://www.ebay.com/' ]
[ 'http://google.com.mx',
'http://www.google.com.mx/',
'https://www.google.com.mx/?gws_rd=ssl' ]
[ 'http://microsoft.com',
'https://microsoft.com/',
'https://www.microsoft.com/',
'https://www.microsoft.com/ja-jp/' ]
http://bing.com HEAD method not allowed
[ 'http://bing.com',
'http://www.bing.com/',
'https://www.bing.com:443/?toHttps=1&redig=391CF6571E174A65AB86697A93000448' ]
[ 'http://ok.ru' ]
[ 'http://imgur.com', 'https://imgur.com/' ]
[ 'http://bongacams.com' ]
[ 'http://hao123.com',
'http://www.hao123.com/',
'https://www.hao123.com/' ]
[ 'http://aliexpress.com', 'https://www.aliexpress.com/' ]
[ 'http://mail.ru', 'https://mail.ru/' ]
[ 'http://google.com.tr',
'http://www.google.com.tr/',
'https://www.google.com.tr/?gws_rd=ssl' ]
[ 'http://google.com.au',
'http://www.google.com.au/',
'https://www.google.com.au/?gws_rd=ssl' ]
[ 'http://whatsapp.com', 'https://www.whatsapp.com/' ]
[ 'http://google.pl',
'http://www.google.pl/',
'https://www.google.pl/?gws_rd=ssl' ]
[ 'http://google.co.id',
'http://www.google.co.id/',
'https://www.google.co.id/?gws_rd=ssl' ]
[ 'http://xhamster.com', 'https://xhamster.com/' ]
[ 'http://google.com.ar',
'http://www.google.com.ar/',
'https://www.google.com.ar/?gws_rd=ssl' ]
[ 'http://xnxx.com', 'http://www.xnxx.com/' ]
[ 'http://google.co.th',
'http://www.google.co.th/',
'https://www.google.co.th/?gws_rd=ssl' ]
[ 'http://Naver.com',
'http://www.naver.com/',
'https://www.naver.com/' ]
[ 'http://sogou.com',
'http://www.sogou.com/',
'https://www.sogou.com/' ]
[ 'http://samsung.com',
'http://www.samsung.com/',
'http://www.samsung.com/jp/',
'http://www.samsung.com/jp/home/',
'http://www.galaxymobile.jp/' ]
[ 'http://accuweather.com',
'http://www.accuweather.com/',
'https://www.accuweather.com/',
'https://www.accuweather.com/en/jp/japan-weather' ]
[ 'http://goo.gl',
'https://goo.gl/',
'https://accounts.google.com/ServiceLogin?service=urlshortener&continue=https://goo.gl/?authed%3D1&followup=https://goo.gl/?authed%3D1&passive=true&go=true',
'https://goo.gl/?authed=1' ]
[ 'http://sm.cn', 'http://m.sm.cn/' ]
[ 'http://googleweblight.com' ]

対象のウェブサイトは 67 です
日本だと目にしないところも多いです

この内 53 が https のページにリダイレクトしました
ドメインが変わってるものもありますけど

https にリダイレクトされないサイトは baidu や weibo など中国のサイトが多めです
sohu.com や sina.com.cn は聞いたことなかったですが開いてみると中国語でした

また alipay.com などいくつかのサイトは http レスポンスではリダイレクトしませんが開いてみると https のページが表示されました
HTML の meta タグや JavaScript でリダイレクトしてるのだと思います

t.co ではトップページだとエラー表示になるのでリダイレクトしてませんでした
t.co は Twitter の短縮 URL なのでコンテンツがあればそこにリダイレクトするので自身の https にリダイレクトにしなくても良さそうです
http のレスポンスに短縮リンクのリダイレクト先が載っていたらセキュアじゃないから見られる と言ったところでその短縮 URL が知られてるなら一度 https にしたところで盗み見した人が自分でアクセスすればいいだけですから

qq.com は唯一タイムアウトでエラーでした
ブラウザだと画面は出ましたがロード中のくるくるが終わらなかったのでブラウザでもタイムアウトしてそうです

googleweblight.com はブラウザで開いてもエラーでしたが 400 が返ってきます

今回の確認は http header だけあればいいので通信は HEAD メソッドにしていたのですが amazon, bing, netflix などでは 405 が返って来ました
リクエストメソッドでレスポンスを変えているケースもなくはないので リダイレクト先がブラウザで開いた時と異なるケースがあるかもしれません
linkedin ではブラウザでは問題ないのにリダイレクトループになっていましたし

なんにせよ有名サイトなら全部 http で何かは返ってきてます
http をブロックしてるらしいサービスだと待っても待ってもレスポンスがなくて しばらく待たされた後にブラウザのエラー画面ですからすごく不便なんですよね