PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > DynamicMTML > 一定ルールにマッチする場合にHTTPS⇄HTTPを指定してリダイレクトさせる

2014年04月02日

一定ルールにマッチする場合にHTTPS⇄HTTPを指定してリダイレクトさせる

以下のようなことを実現したいというお問い合わせをいただきました。

  • 入力フォームにHTTPでアクセスされた時にはHTTPSにリダイレクト
  • 入力フォーム以外にHTTPSでアクセスされた時にはHTTPにリダイレクト

URLを置換する方法については以下の記事などを参考にしていただくと良いと思いますが、テンプレートで正規表現を使うなど、設定が多少面倒な面はあるかと思います。

このような時、先にご紹介した DynamicMTMLのコールバックプラグインを作成することで、簡単に要件を満たすことができます。

前提条件

  • フォームのURLが、 https://www.example.com/entry_form/entry_form.html のように、リクエストパスが /entry_form/ から始まっている
  • HTTP、HTTPSで同一のドキュメントルートが参照できるようになっている(どちらでアクセスしても同じデータが返る)
  • 上記条件にマッチする場合、HTTP、HTTPS間でリダイレクトし、適切なURLにリダイレクト(恒久的リダイレクト)したい
  • パスの設定は後から変更可能にしたい

DynamicMTMLが有効である必要があります。言語はPHPです。

https://gist.github.com/alfasado/9929503

このファイルを mt/plugins/HttpHttpsTransfer/php/config.php に設置します。

<?php
class HttpHttpsTransfer extends MTPlugin {
    var $registry = array(
        'config_settings' => array(
            'HttpHttpsTransferPathBegin' => array( 'default' => '/entry_form/' ),
        ),
        'callbacks' => array(
            'post_init' => 'post_init',
        ),
    );
    function post_init ( $mt, &$ctx, &$args ) {
        $app = $ctx->stash( 'bootstrapper' );
        $path = $app->config( 'HttpHttpsTransferPathBegin' );
        $url  = $app->stash( 'url' );
        $request = $app->stash( 'request' );
        if ( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS'] === 'off' ) {
            if ( strncmp($path, $request, strlen($path)) === 0 ) {
                $url = preg_replace( '!^http:!', 'https:', $url );
                $app->moved_permanently( $url );
                exit();
            }
        } else {
            if ( strncmp($path, $request, strlen($path)) !== 0 ) {
                $url = preg_replace( '!^https:!', 'http:', $url );
                $app->moved_permanently( $url );
                exit();
            }
        }
    }
}
?>

コードの解説

var $registry(配列) に指定した config_settings の HttpHttpsTransferPathBegin は、mt-config.cgi に指定があればそちらの値が使われます。指定がない場合は、config.php 内に記載した値が使われます。

$_SERVER['HTTPS'] は未定義になりえますが、IIS環境などでは文字列 'off'が返る場合があります。

$app->stash( 'url' )に、リクエストのURL、$app->stash( 'request' ) に、URLからアプリケーションのプロトコルとFQDNを除いたもの(http://example.com/foo の場合、 /foo)がセットされていますので、HTTP、HTTPSのリクエストそれぞれに、$app->stash( 'request' )HttpHttpsTransferPathBegin で指定した値で始まるかどうかをチェックして、リダイレクトすべきケースでは $app->moved_permanently メソッドに置換後のURLを渡してリダイレクトします。

$app->moved_permanently はクラスDynamicMTMLのメソッドで、301 Moved Permanently ヘッダを付けてリダイレクトします。一時的な302リダイレクトの時には $app->redirect メソッドを利用してください。

ここで紹介した方法は、他にもリニューアル時の新旧URLのリダイレクトなどに応用できるかと思います。


カテゴリー
DynamicMTML
PowerCMS 3
PowerCMS 4
サイト制作全般
プラグイン
技術情報
設定・管理画面カスタマイズ

Recent Entries