忘れないように記録しとこ

カバの樹

さくら共用サーバーで無限ループが発生!発生したループを終わらせる話

2016年4月13日

動作環境

サーバー: さくら 共用 ビジネスプロ
Wordpress : 4.4.2

 

ことの始まり

そう、あれは、土日を満喫しホームページ公開当日を迎えた月曜日の話。
管理人は、DNS切り替えを済ませ、優雅に紅茶を飲んでいました。
DNSが浸透するのには、時間が掛るのです。
だから時間を潰すために、いやいやながら、仕方なく思いつつ、ため息混じりに紅茶の啜っていました。
いやー、ずっとこうしていたい。

このまま寝てしまおうかなー、思い始めた頃に声があがったのです。

「お問い合わせフォームおかしくね?」

管理人は紅茶を一気飲みしました。

※ どうでも良い小話が続きます。対処だけ知りたい方は、以下リンクを辿って下さい。

 

問題はお問い合わせフォームで起きてるんじゃねぇ!サーバーで起きてるんだ!

企画は、ホームページのリニューアル。
新しく作ったものを新サーバーに乗せて、DNSを切り替えるだけで済むはずです。

今までも同じような作業をしてきましたし、悩むようなことはないはずでした。

しかし、結果はご覧のとおり。

お問い合わせフォームが無限ループを起こしていました。

いやいや、待て待て、まだ浸透が済んでないだけだって!
大丈夫だいじょ・・・、ん?

IPは新サーバーになってるぞ?
これってもう切り替わってるんじゃね?

ここで、一回トイレに行くことにしました。
精神統一は大事!
一回気持ちを落ち着けよう!

よし、行くぞ!

うん、ループしてる。

なんで?!

システムはWordpress で出来ている。
お問い合わせフォームは contactForm7製。

原因は、そこにあるのでは?
いや、待て、他の企画の時に正常動作をしているのを確認している。
とすると、問題は別では?

試しに、お問い合わせフォーム以外でSSL通信をする。

うん、駄目だ。
他のページもダメだ。

そう、原因は別にあったのです。
SSLにあったのです。
というか、サーバーにあるのでは?

調査開始!

 

さくらはプロキシサーバーも使ってるよ!

たまたまですが、すぐに原因がわかりました。

一般設定でサイトアドレスを「www」抜きにした所、無限ループせずアクセスができました。
お前が原因か!

お前が原因か?

ほんとに?

なんと不思議な現象でしょう。
なんだこれ?

すばやく電凸にとりかかります。
その間、およそ15分!
え?長いって?
そりゃ、紅茶を飲んでましたから!(本日2杯目

して、サポートに問い合わせると以下のページに誘導されます。

https://help.sakura.ad.jp/app/answers/detail/a_id/2325

■ウェブサーバの挙動

・環境変数の取扱い
「さくらのレンタルサーバ」にて提供しているウェブサーバApacheは、 80番ポートを使用する(HTTP)ものと、 443番ポートを使用する(HTTPS)ものとの 2種類に分けられます。 また、後者についてはプロクシとして動作します。 一般的に、前者は「http://」、後者は「https://」という形式でアクセスしますが、 同じディレクトリへのアクセスであっても、その際に呼び出されるウェブサーバ が異なると、 CGIプログラムやウェブサーバが.htaccessなどのファイルを読み込む際、挙動に違いが生じます。 例えば、HTTPとしてアクセスした場合はお手元のコンピュータが、 HTTPSとしてアクセスした場合は サーバそのものがアクセス元となります。 このため、SSLのみのアクセス許可(HTTPアクセスの制限)や、mod_rewriteによるURLの書き換えはできません。

うん、良く意味がわからないね。
日本語って難しいね。

 

プロキシサーバー経由の動作

つまり、こういうことですかね?

【ブラウザ】<https頂戴

https://

【プロキシサーバー】

https://

【Wordpress】<$_SERVER['HTTPS']ないからhttpな

http://

【プロキシサーバー】

http://

【ブラウザ】<アイエー、httpsと違う!

 

ブラウザもからみ合ってめちゃくちゃ

これが、さくらサーバーの動きとして、これだと無限ループにはなりません。
ただ単に、https通信が、httpに置き換わって返ってくるだけです。

しかし管理人の場合には、ブラウザの挙動が絡んでいました。

ブラウザは、リダイレクトをキャッシュする機能を持っています。
そう、持っているのです。

この機能が絡んでくるとこうなります。

【ブラウザ】

https://

【プロキシサーバー】

https://

【Wordpress】<$_SERVER['HTTPS']ないからhttpな

http://

【プロキシサーバー】

http://

【ブラウザ】<アイエー、httpsと違う! https頂戴!

https://

【プロキシサーバー】

https://

【Wordpress】<$_SERVER['HTTPS']ないからhttpな

http://

【プロキシサーバー】

http://

【ブラウザ】<アイエー、httpsと違う! https頂戴!

https://

以下無限ループ・・・辛いです。

 

「www」抜きの謎

さてさて、謎がもう一つ残ってます。
なぜ「www」を取ると、正常に稼働したのか・・・。

これは、「www」を利用しない場合は、プロキシサーバーを経由しないからではないでしょうか?
それならば、納得できるかなと。
※ 管理人の妄想です

 

さくら共用サーバーでSSL対応Wordpressを運用するなら2パターンから選択する

1、ドメインを「www」抜きで運用する
2、プロキシ経由からでも動作するようにカスタマイズする

「1」を選択するのが、自然な形でプログラム的には問題無く運用できると思います。
ただ、絶対それが通れるかと言うと、そうではありません。
「2」を選択せざる得ない場面もあるでしょう。

今回のケースは「2」を選択せざる得なかったです。
ではどうするか?

 

 プロキシ経由からでも動作するようにカスタマイズする

テーマファイル内のfunctions.phpに以下のものを記載してください。
$domain には、お手持ちのサイトドメインを入力しください。

if( isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR']) ) {
    $_SERVER['HTTPS'] = 'on';
    $_ENV['HTTPS'] = 'on';
    $domain = 'www.kabanoki.net'; // 対象ドメインを入力
 
    $_SERVER['HTTP_HOST'] = $domain;
    $_SERVER['SERVER_NAME'] = $domain;
    $_ENV['HTTP_HOST'] = $domain;
    $_ENV['SERVER_NAME'] = $domain; 
} 

 

設定は、以上です。

では、また

  • B!