CloudFlareの無料SSLを試したらwordpressがリダイレクトループになってアワワ

以前、「CDNもSSL(TLS)もSPDYも全部無料、そうCloudFlareならね」という記事でCloudFlareの無料SSLを紹介しました。先ほど確認したところ私のドメイン”srytk.com”も無事に利用できるようになりました。早速WordpressをHTTPS化してみたところ、なんと無限リダイレクトループでブログがアクセス不可に!でも、なんとか解決したので紹介しておきます。

なぜリダイレクトループ?

まず、前置きとしてwordpressをhttps化する方法ですが、ダッシュボードの設定から「一般」へ移って、wordpressアドレスとサイトアドレスをhttps://に変えるだけです。検索したら出てきた記事を参考にしました。

さて本題。最初に、リダイレクトループの原因を探るためレスポンスheaderを覗いてみました。 https://srytk.com/にアクセスするとLocationフィールドに”https://srytk.com/”が設定されていました。

Locationフィールドとは、一般に、目的のURLの内容が別のURLに移動された時に使われるもので、転送するときに設定されます。すなわち、ブラウザとwordpressのやりとりはこのようになります。

まず、ブラウザがhttps://srytk.com/にアクセスします。wordpressは「君のリクエストした内容はhttps://srytk.com/に移動になったよ。」と返事します(転送)。ブラウザはwordpressの指示に従って、またhttps://srytk.com/にリクエストを投げます。しかし、https://srytk.com/へのリクエストは「https://srytk.com/へ移動せよ」という指示なわけですから、何度リクエストし直そうが、ここで堂々巡りなわけです。まさにリダイレクト(転送)ループ!

まさにループ!ループ & ループ ! ASIAN KUNG-FU GENERATION 『ループ&ループ』

Flexible SSLの仕組みを理解しよう!

この流れは一見奇妙に見えます。なぜ、wordpressはhttps://srytk.com/をhttps://srytk.com/に転送してしまうのでしょうか。それはFlexible SSLがポイントでした。無料プランのSSLはFlexible SSLがデフォルトなわけですが、Flexible SSLはブラウザとCloudFlareの間のみhttpsな接続を可能にします。逆に言えば、CloudFlareとwordpressの間はhttpな接続というわけです。つまり、ブラウザがhttpsなリクエストをwordpressにしても、wordpressにはhttpなリクエストに見えるわけです。wordpressはブログのURLがhttps://srytk.com/なのにhttp://srytk.com/でブラウザがリクエストしたように見えるため、「https://srytk.com/へ移動せよ」という頓珍漢な返事してしまうわけです。

ssl

What do the SSL options (Off, Flexible SSL, Full SSL, Full SSL Strict) mean?より。Origin serverがwordpressだと思ってください。

解決法

wordpressからhttpなリクエストに見えるのが問題なので、wordpressを騙します。wordpressはis_ssl()という関数で、httpかhttpsかを判断しているようです。その中身は最初に$_SERVER[‘HTTPS’]が’on’かどうかを見ているようですから、wordpressの子テーマのfunction.phpあたりで上書きすると、良さそう。ということで、でっち上げました。これをfunctions.phpに追加します。

とりえず、今のところ上手く動いています。

子テーマを使ってない人は、wordpressのrootディレクトリにあるwp-config.phpの一番上あたりに”$_SERVER[‘HTTPS’] = ‘on’;”と書き込めばいけそうですね。

グローバルな変数を上書きしてるし、何もチェックしてないから、sslに関係するプラグインを使ってると問題が起きそうなのが怖いですね。だれかプラグイン作って欲しい><