特定ページのみSSL認証で表示する方法
提供: GeeklogJpWiki
目次 |
特定ページのみSSL認証で表示する方法
Geeklogでは標準でSSL認証のページを作成する機能は搭載されていません(この記事を記載している時点において)
「SSL認証」、つまり「https://」でページを表示したい場合は、幾つかの設定を行う必要があります。
ここでは「リダイレクト」という方法を使って、任意のページに対しSSL認証のアクセスを実現する方法を紹介しています。
参考URL
検証環境
- Geeklog 1.5.1, 1.6.1, 1.7 1 1.8.0
前もって行う準備
任意のページでSSL認証の表示を行う前に、以下の条件をクリアしておく必要があります
- 普通(http://)のGeeklogサイトが正常に表示される。
- SSL領域が、non-SSL領域と異なる場合、non-SSL領域のファイル(index.php, lib-common.php, siteconfig.php, layout/* 他)すべてをあらかじめSSL領域にコピーしておきます。
- 契約サーバー、または自分で稼働させているサーバー環境にて、SSLの契約、設定が済んでいる。例えば「SSL認証会社との契約」(または自己SSL認証)、「認証キーをサーバーに反映させる」等
設定方法
編集対象のファイル
ファイル: lib-common.php
line:about 103
変更方法(How to)
from:
$_CONF = $config->get_config('Core');
to:
$_CONF = $config->get_config('Core');
// SSL認証で表示する <--
// 初期値設定 <--
// インストールURL http://www.geeksite.com https://www.geeksite.com
$site_domain_non_ssl = 'http://www.geeksite.com';
$site_domain_ssl = 'https://www.geeksite.com';
$site_path_non_ssl = '';
$site_path_ssl = '';
$path_html_non_ssl = '/var/www/virtual/geeksite.com/htdocs/';
$path_html_ssl = '/var/www/virtual/geeksite.com/htdocs/';
// 初期値設定 -->
$request_type = (strtolower($_SERVER['HTTPS']) == 'on' || $_SERVER['HTTPS'] == '1' || strstr(strtoupper($_SERVER['HTTP_X_FORWARDED_BY']),'SSL') || strstr(strtoupper($_SERVER['HTTP_X_FORWARDED_HOST']),'SSL')) ? 'SSL' :
// 上記で動かない環境では下記のコメントアウトを消して使ってください
// $request_type = ($_SERVER['SERVER_PORT'] !== '80') ? 'SSL' : 'NONSSL';
$url_current = COM_getCurrentURL();
if( $request_type == 'SSL'){
// SSLとしてアクセスされたら
if(
( strpos($url_current , '/staticpages/index.php/contact') !== false )
){
// SSL設定
$_CONF['site_url'] = $site_domain_ssl . $site_path_ssl;
$_CONF['path_html'] = $path_html_ssl;
$_CONF['path_images'] = $_CONF['path_html'] . 'images/';
$_CONF['path_themes'] = $_CONF['path_html'] . 'layout/';
$_CONF['path_layout'] = $_CONF['path_themes'] . $_CONF['theme'] . '/';
$_CONF['site_admin_url'] = $_CONF['site_url'] . '/admin';
$_CONF['layout_url'] = $_CONF['site_url'] . '/layout/' . $_CONF['theme'];
} else {
// non-SSL設定
$_CONF['site_url'] = $site_domain_non_ssl . $site_path_none_ssl;
$_CONF['path_html'] = $path_html_non_ssl;
$_CONF['path_images'] = $_CONF['path_html'] . 'images/';
$_CONF['path_themes'] = $_CONF['path_html'] . 'layout/';
$_CONF['path_layout'] = $_CONF['path_themes'] . $_CONF['theme'] . '/';
$_CONF['site_admin_url'] = $_CONF['site_url'] . '/admin';
$_CONF['layout_url'] = $_CONF['site_url'] . '/layout/' . $_CONF['theme'];
$url = str_replace( $site_domain_ssl, $site_domain_non_ssl, $url_current);
header('Location: ' . $url);
}
} else {
// non-SSLとしてアクセスされたら
if(
( strpos($url_current , '/staticpages/index.php/contact') !== false )
){
// SSL設定
$_CONF['site_url'] = $site_domain_ssl . $site_path_ssl;
$_CONF['path_html'] = $path_html_ssl;
$_CONF['path_images'] = $_CONF['path_html'] . 'images/';
$_CONF['path_themes'] = $_CONF['path_html'] . 'layout/';
$_CONF['path_layout'] = $_CONF['path_themes'] . $_CONF['theme'] . '/';
$_CONF['site_admin_url'] = $_CONF['site_url'] . '/admin';
$_CONF['layout_url'] = $_CONF['site_url'] . '/layout/' . $_CONF['theme'];
$url = str_replace( $site_domain_non_ssl, $site_domain_ssl, $url_current);
header('Location: ' . $url);
}
}
// 特定ページのみSSL認証で表示する -->
前提条件
- サイトURL: 'http://www.geeksite.com/dir'
- SSLのパス: '/usr/home/x000000/secure/dir/'
- SSL認証で表示したいページ:
- 静的ページ「お問い合わせ」: '/staticpages/index.php/contact'
これで任意のページに対してのみSSLでアクセスします。
注意:
$_SERVER['PHP_SELF'] に、静的ページのIDが渡されないサーバの場合は、静的ページIDによる制御ができません。$_SERVER['PHP_SELF']に何が渡されるのか、あらかじめ静的ページPHPに、以下のテストを行なって確認してください。
global $_SERVER; echo 'PHP_SELF: ' . $_SERVER['PHP_SELF']. '<br>';
補足:
このハックは、サポート掲示板でkinoさん、suzuyanさんのフィードバックに加え、Ivyの、セキュアパスが異な り、しかもサブディレクトリへの設置に対応させて完成しました。情報提供、ありがとうございました。
- 活用事例: http://www.collabonote.com/edu/
- SSL: https://www.collabonote.com/edu/staticpages/index.php/contact_general
- 他のURLはすべてnon-SSL
プラグインのヘッダコード
プラグインのヘッダコードによりSSLがエラーを起こす場合があります。 その場合は、プラグインのfunctions.incなどにふくまれる plugin_getheadercode_プラグイン名() を以下のように、SSLのときに無効にします。
from:
function plugin_getheadercode_jquery()
{
global $_CONF, $_JQ_CONF, $LANG_JQUERY_FEEDBACK, $_SCRIPTS;
to:
function plugin_getheadercode_jquery()
{
global $_CONF, $_JQ_CONF, $LANG_JQUERY_FEEDBACK, $_SCRIPTS;
$request_type = (strtolower($_SERVER['HTTPS']) == 'on' || $_SERVER['HTTPS'] == '1' || strstr(strtoupper($_SERVER['HTTP_X_FORWARDED_BY']),'SSL') || strstr(strtoupper($_SERVER['HTTP_X_FORWARDED_HOST']),'SSL')) ? 'SSL' : 'NONSSL';
if($request_type == 'SSL' ){
return;
}