Facebookページはmixiと同じように、暗号化通信でログインできるモードがあります。
ですが、このモードで、IFrameで作られていて「セキュア接続のときの読み込み元」を指定していないFacebookページへ行くと、警告画面が出てしまいます。
IFrame内にフォームがあったりもするのですから、当然と言えば当然の話です。
となると、読み込み元のページをセキュア接続=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ページはこの方法でセキュア対応をしました。
- 画像・CSSが「httpからの絶対パス」になるようにCMSを構築する
- 共有SSLに対応させたいページを、PHPの「file_get_contents」関数で取得
- ドメインを共有SSL用のドメインに「mbereg_replace」関数で置換
- 同じ階層の別ディレクトリに実体ファイルとして書き出す
- 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);
}
}
?>