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のリダイレクトなどに応用できるかと思います。
コメントを投稿する