特定ページのみSSL認証で表示する方法
提供: GeeklogJpWiki
目次 |
特定ページのみSSL認証で表示する方法
Geeklogでは標準でSSL認証のページを作成する機能は搭載されていません(この記事を記載している時点において)
「SSL認証」、つまり「https://」でページを表示したい場合は、幾つかの設定を行う必要があります。
ここでは「リダイレクト」という方法を使って、任意のページに対しSSL認証のアクセスを実現する方法を紹介しています。
参考URL
検証環境
- Geeklog 1.5.1, 1.6.1, 1.7.0
- 稼動サーバー:Coreserver, CPI
前もって行う準備
任意のページでSSL認証の表示を行う前に、以下の条件をクリアしておく必要があります
- 普通(http://)のGeeklogサイトが正常に表示される。
- SSL領域が、non-SSL領域と異なる場合、non-SSL領域のファイル(index.php, lib-common.php, siteconfig.php, layout/* 他)すべてをあらかじめSSL領域にコピーしておきます。以下のようなphpファイルをサーバにアップして実行しても良いでしょう。(十分注意してプログラムを実行してください。path_to_public path_to_secureは、実際のパスにあわせて修正してください。
<?php
// 公開領域のデータのコピー
system("cp -Rf /path_to_public/* /path_to_secure/");
?>
- 契約サーバー、または自分で稼働させているサーバー環境にて、SSLの契約、設定が済んでいる。例えば「SSL認証会社との契約」(または自己SSL認証)、「認証キーをサーバーに反映させる」等
設定方法
編集対象のファイル
ファイル: lib-common.php
line:about 103
変更方法(How to)
変更前(before):
$_CONF = $config->get_config('Core');
変更後(after):
$_CONF = $config->get_config('Core');
// SSL認証で表示する <--
// 初期値設定 <--
// インストールURL http://yourgeeksite/dir_non_ssl https://yourgeeksslsite/dir_ssl
$site_domain_non_ssl = 'http://yourgeeksite';
$site_domain_ssl = 'https://yourgeeksslsite';
$site_path_non_ssl = '/dir_non_ssl';
$site_path_ssl = '/dir_ssl';
$path_html_non_ssl = '/path_to_non_ssl_html/';
$path_html_ssl = '/path_to_secure_html/';
// 初期値設定 -->
$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'){
// SSLとしてアクセスされたら
if(
( strpos($_SERVER['PHP_SELF'] , $site_path_ssl . '/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_non_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 = $site_domain_non_ssl . $_SERVER['REQUEST_URI'];
header('Location: ' . $url);
}
} else {
// non-SSLとしてアクセスされたら
if(
( strpos($_SERVER['PHP_SELF'] , $site_path_non_ssl . '/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 = $site_domain_ssl . $site_path_ssl . $_SERVER['REQUEST_URI'];
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