Drupal_共有SSLサーバー(共有証明書を経由する場合)のHTTPS設定について

本文は http://drupal.org/node/339552の内容をDrupalTipsが意訳したものす。内容に関してあいまいな部分がある場合は必ず原文を参照してください。

以下、訳です。



共有SSL証明書を使用する場合のDrupal設定方法について、私の体験を皆さんと共有したいと思います。ここでは、SSLサーバーがひとつのホストを他者と共有し、テスト環境が限られている場合を想定しています。

プロバイダーのホストのようにhttpsを使いたくても、他人の名前を直接付けることはできません。その代わり、共有SSLサーバーのプロバイダーが与える特別なURLにあなたのドメイン名を追加することで、SSLページとして自サイトを呼び出すことが出来ます。SSLサーバーは、サーバー内部にある、通常のHTTPページ(httpsではない)を経由して呼び出しているのです。
そして、呼び出しに対して、元のページを返しているのです。

あなたのDrupalサイトの主な問題は次のとおりです。

  • https要求を知らない
  • おそらく$base_urlの共有SSLアドレスへの置き換えがうまくいっていない

この情報をWEBで探したとき、あなたはこのサイトを見つけることでしょう

私は、Drupalコアのをいじることなく、settings.phpファイルの中で問題解決をしました



01: $request_type = ($_SERVER['HTTP_X_FORWARDED_HOST'] == 'ssl.proxy.org') ? 'SSL' : 'NONSSL';

02: if($request_type!="SSL"){

03: //header("Location:https://ssl.proxy.org/www.example.com");

04: $base_url = 'http://www.example.com'; // NO trailing slash!

04a: $base_url = 'http://www.example.com/some/dir'; // NO trailing slash!

05: $cookie_domain = 'www.example.com';

06: } else {

07: $base_url = 'https://ssl.proxy.org/www.example.com'; // NO trailing slash!

07a: $base_url = 'https://ssl.proxy.org/www.example.com/some/dir'; // NO trailing slash!

08: $cookie_domain = 'ssl.proxy.org';

09: $_SERVER['HTTPS']='on';

10: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI'];

10a: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI']; // Only the DNS name of the site needed here!

11: $conf = array(

12: 'reverse_proxy' => TRUE,

13: 'reverse_proxy_addresses' => array($_SERVER['REMOTE_ADDR']),
14: );

15: }


まず、コード中の「www.example.com」をあなたの共有SSL証明書があるSSLサーバーのドメイン名に置き換えてください



01: $request_type = ($_SERVER['HTTP_X_FORWARDED_HOST'] == 'ssl.proxy.org') ? 'SSL' : 'NONSSL';

ホストは、$_SERVER['HTTP_X_FORWARDED_HOST'].のなかのドメイン名を共有SSLサーバーに送っています。もし外部SSLサーバーを使用している場合で、うまく動かない場合は、$_SERVERをの記述をチェックしてみてください。(私はなにも触らずいけました)



02: if($request_type!="SSL"){

03: //header("Location:https://ssl.proxy.org/www.example.com");

04: $base_url = 'http://www.example.com'; // NO trailing slash!

04a: $base_url = 'http://www.example.com/some/dir'; // NO trailing slash!

05: $cookie_domain = 'www.example.com';

4行目と5行目はもしかしたら必要ないかもしれません。Drupalは、自動でこれを処理するかもしれないからです。しかし、念のため私はコードの中に入れて、$base_urlのURLを設定しました。

3行目は、あなたのサイトが固定の場合、コメントアウトをはずしてください。

メモ:4行目はサブフォルダ以下にSSLページが存在する場合、その位置(ディレクトリ)を示すものです



07: $base_url = 'https://ssl.proxy.org/www.example.com'; // NO trailing slash!

07a: $base_url = 'https://ssl.proxy.org/www.example.com/some/dir'; // NO trailing slash!

http://www.example.comからSSLサーバへの要求は同じURLからきたものだとDrupalに認識させなければいけません。この行は、CSSや画像、javascriptのように、URLを訂正し、元のソースを辿って結果を返します。http:ssl.proxy.org/moduke/...の最後に自分のドメイン名と置き換えるサイトのドメインSSLサーバー

メモ:7行目はサブフォルダ以下にSSLページが存在する場合、その位置(ディレクトリ)を示すものです



08: $cookie_domain = 'ssl.proxy.org';

同じドメインのURLのみをcookieが受け取るようにブラウザの設定をします、そして、$cookie_domainをSSLサーバードメインに変更する必要があります(★この行なしで私はログインすることができませんでした)



09: $_SERVER['HTTPS']='on';

https経由の要求するのなら、Secure Pagesのようなモジュールを知っておくと便利です。httpからSSLサーバーに要求するので、httpsからの要求と見せかけなければいけません。



10: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI'];

10a: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI']; // Only the DNS name of the site needed here!

この行なしでもフォーム以外は全てが機能しました。この原因はhttp://drupal.org/node/60222でcommon.incのハックとして提案されています。

theme_form()の最初の場所で与えられるURLが悪いのかとおもったのですが、理解するのにかなり時間がかかりました。URLを作ることにしました

URLは、request_uri()のなかで設定します

少なくとも、ホストSSLサーバーの$_SERVER['REQUEST_URI']を設定してください。そしたら私が制作しなければならなかったDrupalのURLの訂正をドメイン名???

$_SERVER['REQUEST_URI']は既に'/some/dir'に含まれている。www.example.comとwww.example.com/some/dirをここで置き換える必要はない。



11: $conf = array(

12: 'reverse_proxy' => TRUE,

13: 'reverse_proxy_addresses' => array($_SERVER['REMOTE_ADDR']),

14: );

SSLサーバーのIPアドレス設定とreverse_proxyをできるようにしなければらならない。呼び出し元のIPアドレスDrupalが記録する(SSLサーバーIPアドレスの代わりに)

ホストはIPを異なる呼び出し(おそらくloadbalancingのため)のためにIPを変化させる、私はreverse_proxy_addressesを$_SERVERに適した設定できるようにする

drupalコアをいじることなく、なにかしらのハッキングをすることなく、tpl.phpファイルとその他のものであなたは本当にやりたくないことをします。



実際に出来上がったコードは、以下のとおりです。これをsetting.phpに追記しました。赤字が変更箇所で、不要なコードは削除しています。




$request_type = ($_SERVER['HTTP_X_FORWARDED_HOST'] == 'ssl2.sixcore.ne.jp') ? 'SSL' : 'NONSSL';

if($request_type!="SSL"){


$base_url = 'http://example.jp'; // NO trailing slash!


$cookie_domain = 'example.jp';

} else {

$base_url = 'https://ssl2.sixcore.ne.jp/example.jp'; // NO trailing slash!


$cookie_domain = 'ssl2.sixcore.ne.jp';

$_SERVER['HTTPS']='on';

$_SERVER['REQUEST_URI']='/example.jp'. $_SERVER['REQUEST_URI'];


$conf = array(

'reverse_proxy' => TRUE,

'reverse_proxy_addresses' => array($_SERVER['REMOTE_ADDR']),

);

}

settings.phpには、このコードとは別にデフォルトで$base_url = 'http://www.example.com';の記述が存在します。しかし、通常はコメントアウトされているはずなので、コードがダブるということはありません。念のため、コードの前に「#」がついているかを確認するといいと思います。

トラブルシューティング

$cookie_domain = 'ssl2.sixcore.ne.jp';

この記述を最初は、

$cookie_domain = 'ssl2.sixcore.ne.jp/example.jp';

としており、投稿結果にsslでアクセスできないなどの問題にぶつかりました。しばらくここが原因と気づけず悩みましたが、ここを改善後、sslページでログインしなおしたところ、sslで投稿結果を閲覧することができました。

参考サイト