特定ページのみ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の、セキュアパスが異な り、しかもサブディレクトリへの設置に対応させて完成しました。情報提供、ありがとうございました。

個人用ツール