Joomla! サイトで一部ページを共有SSLで表示する（ChronoForms）

共用サーバをレンタルするような小規模サイトの場合、SSL利用はドメインがかわってしまうことが多く、SSL利用をあきらめてしまう例が見受けられます。

Joomla!はとても信頼できるCMSです。少しの工夫でほとんどの提案は確実に実装できます。
コアファイルを編集しない！　という鉄則はもちろん遵守です。

共用サーバで、特定のページだけ違うドメインでのSSL通信ページとして表示する方法をメモしておきます。
※PHP技術者向けの設定ですので、プログラムがわからない方は設定時の不具合に対処できない可能性がありますのでご注意下さい。


#環境
##検証環境
利用CMS：Joomla!2.5 以上で検証済
サーバ環境：ドキュメントルートが SSL/non SSLともに同じ場所
※一部レンタルサーバではSSLページのディレクトリが分かれています。その場合は、まったく同じファイルをSSL側に設置する事で対応可能。でも本来はできるだけ、SSL表示もnon SSL表示も同じディレクトリであるレンタルサーバを選択します。


#課題
##お問い合わせページをSSL通信で表示する


#手順
以下の設定手順でお問い合わせページを表示する

##1. フォーム作成コンポーネントで問い合わせフォームを作成する。
今回はChronoForms v4、v5で検証しました。RSFormPro、ContactEnhancedでは試していませんが、問題がある場合は開発元に問い合わせれば解決できると考えています。
ChronoFormsはWordpress版もリリースされて、よく使っているコンポーネントです。
他のコンポーネントにくらべて、確認画面が実装しやすいと思います。


##2. お問い合わせページ表示する
SEF URLで、エイリアス名がURLになるよう設定しておきます。


##3. お問い合わせページだけSSL通信
テンプレートファイルでリダイレクトを記述します。ページを表示する前に、URLからページを判定して、お問い合わせページだけSSL通信のURLヘPHPでリダイレクトさせます。他のURLの場合は、HTTP通信のURLへリダイレクトしておきます。

編集ファイル：/templates/your template name/index.php
ファイルの先頭へ記述してください。※defined('_JEXEC') or die; の直前

以下contact.htmlというURLのみSSLへリダイレクトする例です。


```
$uri = $_SERVER['REQUEST_URI'];
$serverName = $_SERVER['SERVER_NAME'];
// ローカル環境、評価サイトでは処理をパスするため、本番ドメインのみで判定を有効としています。
if(false !== strpos($_SERVER['HTTP_HOST'], 'ドメイン名') || false !== strpos($_SERVER['HTTP_HOST'], 'SSLのドメイン名')):
	$sslBase = 'https://SSLのドメイン名';
	$httpBase = 'http://ドメイン名';
	switch(true){
		case false === strpos($uri, '/contact.html') && false !== strpos($serverName, 'SSLのドメイン名'):
		// SSLアクセスで問い合わせフォーム以外
			$redirect = $httpBase. $uri;
			break;
		case false !== strpos($uri, '/contact.html') && false === strpos($serverName, 'SSLのドメイン名'):
		// 問い合わせフォーム
			$redirect = $sslBase. $uri;
			break;
		default:
		// 問い合わせフォーム以外でHTTPアクセス
			$redirect = '';
			break;
	}
	
	if(!empty($redirect)){
		header('Location: '. $redirect);
		exit;
	}
endif;
```

SSLページにリダイレクトされているかどうか確認しましょう。


##4. ブラウザセキュリティ警告の調査
SSLページでブラウザにセキュリティ警告が出ている場合は、Chrome要素検証などでform actionパスやlinkファイルのHTTP通信混在がないかどうかチェックしてください。

リンクはなるべく相対パスで出力されるよう、フォーム作成コンポーネントの設定を確認してください。
※コンポーネントが設定に関係なくhttp〜から出力している場合は、テンプレートを編集または開発元へお問い合わせ下さい。


chronoFormsの場合は、http〜から出力している部分でJoomla!のベースURLを取得利用しているので、\$live_siteを設定すれば対処できるとのことでした。\$live_site設定で他のコンポーネントも対処できる可能性がありそうです。

では、\$live_siteを動的に変更してみましょう。


##5. $live_site設定をSSLページの時だけ変更する
configuration.phpで、\$live_site = ''; と設定しておきます。（もともとのサイト設定に値を設定していた場合はそのままでOKです。）

共有SSLのドメインにアクセスしているときだけ、\$live_site設定にSSLのドメイン名URLを上書きしましょう。configuration.phpの JConfigクラスにコンストラクタを追加します。

パブリック変数設定の下に以下のようにコンストラクタを追加して、\$live_siteにSSLのURLを設定しましょう。

```
	
	public function __construct(){
		// live_site 設定
		if(false !== strpos($_SERVER['HTTP_HOST'], 'SSLのドメイン名')){
			$this->live_site = 'https://SSLのドメイン名';
		}
	}
```

以上です。わりと簡単な記述をテンプレートとコンフィグに設定するだけで、共有SSLでページを表示することができます。

configuration.phpにコンストラクタを追加したのは今回が初めてでした。
この方法だと、本番のみデータベースの設定を変更したり、他の要件にも応用できますね！

**注意：管理画面でグローバル設定を更新するとconfiguration.phpをシステムが書き換えます。その際、追加で記述したコンストラクタは削除されてしまいます。フォームが動作しなくなりますのでご注意ください。**

**この方法はまだベストではありません。JConfigの値を動的に変更できる場所を探しています。**

***
####補足
Joomla!やChronoForms関連の技術情報を検索する際に以下のキーワードを使いました。
*shared SSL
*security warning firefox
*the content must be served over HTTPS
*This request has been blocked