MovableTypeで構築したサイトをSSL対応するとログインできなくなる解決策


概要

とあるECサイトでMovableTypeを使っており、常時SSL対応を実施したところMT管理画面にログインできない、あるいは保存できないという事態となりました。ECサイト事業者側での対応は無理そうなので、MTのソースを修正して対応しましたので、その詳細を記します。

現象

  • MTのログインページでユーザ名、パスワードを入れて「サインイン」ボタンを押すと、ERR_CONNECTION_TIMED_OUT となり先に進めない。
  • 既にログイン済みの状態の場合には、通常のブログ管理画面を見たり記事入力画面は出るものの保存をしようとすると、ERR_CONNECTION_TIMED_OUT となり先に進めない。

このエラー、どんな時に出るエラーかというと、
該当アドレスの該当ポートからの応答が無い場合に出るものです。

環境

ECサイト付属の、CMSサーバー(VPS)オプションでMovableTypeを利用しています。

詳細

現象があったMovableTypeのバージョンはMovable Type Pro version 6.3.2
ログイン直後、サーバからの応答は302 でLocationヘッダーにSSL化する前に使っていたURLが出てきます。
このURL,SSL化した後にアクセスすると、応答がありません。

Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 20
Content-Type: application/x-httpd-cgi
Date: Sun, 01 Jun 2019 01:23:45 GMT
Keep-Alive: timeout=1, max=300
Location: https://username.cmx00.hogehoge-shop.jp/mt/mt.cgi?__mode=dashboard
Pragma: no-cache
Server: Apache
Set-Cookie: --省略--; path=/mt/; secure
Vary: Accept-Encoding
X-frame-options: SAMEORIGIN
X-Powered-By: PleskLin

このアクセスの後、Locationヘッダにある文字を変更して本来表示させてほしいURL
https://www.example.com/mt/mt.cgi?__mode=dashboard
にアクセスすると・・・ログインできています。

ここで、サーバ側の環境変数を確認してみます。
適当なファイル名を付けて、見てみると・・・
(例えばcheck-environment.php に下記のPHPを書いておきます)

<pre>
<?php
print_r($_SERVER);
?>
</pre>

ブラウザには下記のものが見えます。
(パスやURLは仮想的なものに書き換えてます)

Array
(
    [PATH] => /sbin:/usr/sbin:/bin:/usr/bin
    [PP_CUSTOM_PHP_INI] => /var/www/vhosts/system/username.cmx00.hogehoge-shop.jp/etc/php.ini
    [PP_CUSTOM_PHP_CGI_INDEX] => fastcgi
    [FCGI_ROLE] => RESPONDER
    [HTTP_HOST] =>username.cmx00.hogehoge-shop.jp
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, br
    [HTTP_ACCEPT_LANGUAGE] => ja,en-US;q=0.9,en;q=0.8,zh-TW;q=0.7,zh;q=0.6
    [HTTP_COOKIE] => mt_user=hogehoge---中略---mt_blog_user=; _gid=GA1.2.34567.1345677
    [HTTP_X_FORWARDED_PROTO] => https
    [HTTP_X_FORWARDED_FOR] => 123.234.56.78
    [HTTP_X_FORWARDED_HOST] => www.example.com
    [HTTP_X_FORWARDED_SERVER] => www.example.com
    [HTTP_CONNECTION] => close
    [SERVER_SIGNATURE] => 
    [SERVER_SOFTWARE] => Apache
    [SERVER_NAME] => username.cmx00.hogehoge-shop.jp
    [SERVER_ADDR] => 23.34.45.56
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 34.45.56.78
    [DOCUMENT_ROOT] => /var/www/vhosts/username.cmx00.hogehoge-shop.jp/httpdocs
    [SERVER_ADMIN] => [email protected]
    [SCRIPT_FILENAME] => /var/www/vhosts/username.cmx00.hogehoge-shop.jp/httpdocs/check-environment.php
    [REMOTE_PORT] => 54632
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /check-environment.php
    [SCRIPT_NAME] => /check-environment.php
    [PHP_SELF] => /check-environment.php
    [REQUEST_TIME] => 1234234324
)

/var/www/vhosts/username.cmx00.hogehoge-shop.jp/httpdocs/check-environment.php はVPSサーバにありがちな絶対パス。
username.cmx00.hogehoge-shop.jp は、HTTPSでアクセスできなかったサーバ名
www.example.com は常時SSL化で、自サイトのURLとなるもの

ここで、MTを構成するファイルで、HTTP_HOST を含むものを探すと、いくつか対象のものが見つかります。
(grepで探すとよいですね)

lib\MT.pm(264):                 my $host = $ENV{SERVER_NAME} || $ENV{HTTP_HOST};
lib\MT\App.pm(3970):     if ( my $host = $ENV{HTTP_HOST} ) {
lib\MT\Bootstrap.pm(205):                 my $host = $ENV{SERVER_NAME} || $ENV{HTTP_HOST};
lib\MT\Util.pm(2841):             for qw(HTTP_HOST GATEWAY_INTERFACE SCRIPT_FILENAME SCRIPT_URL);

$host = で定義されているところが問題ありそうなので

my $host = $ENV{SERVER_NAME} || $ENV{HTTP_HOST};
を下記に変更
my $host = $ENV{HTTP_X_FORWARDED_SERVER} || $ENV{HTTP_X_FORWARDED_HOST} || $ENV{SERVER_NAME} || $ENV{HTTP_HOST};

my $host =  $ENV{HTTP_HOST}
を下記に変更 
my $host =  $ENV{HTTP_X_FORWARDED_HOST} || $ENV{HTTP_HOST} 

以上でログインと保存はできるようになりました。

考察

.htaccess ではApacheの環境変数「HTTP_HOST」や「SERVER_NAME」書き換えができません。 サーバ全体の設定である、httpd.confを書き換えればこれらを書き換え出来るかもしれませんが、今回は サーバの応答に 「Plesk」 とあったので、httpd.conf に手を加える事は難しいのではないか?と見ています。