Blog

ブログ

共有SSL非対応のCMSで、Facebookページのセキュア接続に対応する

Facebookページはmixiと同じように、暗号化通信でログインできるモードがあります。

ですが、このモードで、IFrameで作られていて「セキュア接続のときの読み込み元」を指定していないFacebookページへ行くと、警告画面が出てしまいます。
IFrame内にフォームがあったりもするのですから、当然と言えば当然の話です。

IFrameにSSL用ページを指定していないときの画面

となると、読み込み元のページをセキュア接続=SSLでも表示できるように作れば良いのですが、CMSベースで制作しているとそう簡単にはいきません。

著名なCMSのほとんどが、安価に利用できる共有SSLに対応していないからです。

共有SSLに対応できないCMSとは

具体的には、以下の条件に当てはまるCMSは、URLを書き換える共有SSLに対応できません。

  • URLが指し示す場所に、ブログ記事の実体ファイルがない
  • .htaccessなどを使って、スラッシュ区切りのURLに書き換えている

私がお仕事で対応しているCMSはこんな状況です。

MovableType

再構築で実体ファイルを書き出せるので、アーカイブマッピングなどを工夫して、ページ内のリンクを相対パスにすれば対応可能です。

WordPress

ブログをSSLでも表示できるようにするプラグイン「WordPress HTTPS」が動作すれば対応できます…が、動くかどうかはWordPressの設置状況やサーバーの共有SSLの仕様によって大きく変わってしまい、全く保証できません。

a-blog cms

現バージョンでは対応していないことが、公式に回答されています。
システムが単一のドメインに結び付けられる仕様なので、違うURLに転送できないのです。

どうしても共有SSLに対応したい場合の対策

サイト内の特定のページを共有SSLに対応させるのであれば、(かなり強引ですが)以下のような手段が考えられます。
結局、WebbingStudioのFacebookページはこの方法でセキュア対応をしました。

  1. 画像・CSSが「httpからの絶対パス」になるようにCMSを構築する
  2. 共有SSLに対応させたいページを、PHPの「file_get_contents」関数で取得
  3. ドメインを共有SSL用のドメインに「mbereg_replace」関数で置換
  4. 同じ階層の別ディレクトリに実体ファイルとして書き出す
  5. Facebookのセキュア用URLに、新たに書き出したファイルを指定する

このスクリプトを、一定時間ごとにcronで回します。

ただし、実体ファイルは表示結果から取得しているので、PHPスクリプトは動作しません。「いいね!」判定もできません。

サンプルコード

自動書き出しのサンプルコードは以下の通りです。
通常ページは「fb」ディレクトリ、SSL対応ページは「fb_ssl」ディレクトリとする前提です。

Facebookページがセキュア接続に対応していないと、訪問者が帰ってしまう確率が非常に高くなります。PHPが書ける人は挑戦してみてください。

#!/usr/bin/php5
<?php
$url = array(
	'http://example.com/fb/index.html',
	'http://example.com/fb/post-1.html',
	'http://example.com/fb/post-2.html',
	'http://example.com/fb/post-3.html',
);

$cash = array(
	'/path/to/server/full/fb_ssl/index.html',
	'/path/to/server/full/fb_ssl/post-1.html',
	'/path/to/server/full/fb_ssl/post-2.html',
	'/path/to/server/full/fb_ssl/post-3.html',
);

$sslUrl = 'https://xxxxx-ssl/example.com/';

foreach($cash as $key => $var) {
	$fileContents = file_get_contents($url[$key]);
	
//リンク先を修正
	$pattern = 'href="/fb/';
	$replacement = 'href="/fb_ssl/';
	$fileContents = mb_ereg_replace($pattern, $replacement, $fileContents);
	
//サーバー相対パスを書き換える
	$pattern = '="/';
	$replacement = '="' . $sslUrl;
	$fileContents = mb_ereg_replace($pattern, $replacement, $fileContents);

//	テスト(文字列として出す)
//	echo htmlSpecialChars($fileContents);
//	echo "<p>=================================================</p>nn";

//本番(キャッシュを保存)
	$fh = fopen($var,'w');
	if($fileContents != '') {
		fputs($fh, $fileContents);
		fflush($fh);
	}
}
?>