WordPressの管理画面を共用SSL対応する

encrypted-156514_640

WordPressは基本的におまかせスタイルなのでデフォルトのままではすべて平文でアクセスしてくれます。これだとログイン時のID/パスワードや公開前の恥ずかしい記事本文などが丸見えです。これだと安心して記事を書くことができないので管理画面だけSSL設定を行おうというわけです。

共用SSL

本来はSSLアクセスするためにはサーバ側でSSL証明書等の設定が必要となりますが、今回はホスティングサービスから提供されている共用SSLを利用します。共用SSLの設定方法は使用しているホスティングサービスを参照してください。

共用SSLの設定が終了した時点でSSLアクセス自体は可能となりますが、ホームディレクトリ等の関係によりページがうまく表示できないのでプラグインを導入する必要があります。

プラグインの導入

導入するプラグインは「WordPress HTTPS」、この時点でのバージョンは3.3.6です。
wordpress-https
「https」検索すると出てくるのでインストールします。インストールが終わるとメニューに「HTTPS」という項目が新たに追加されます。選択するとプラグインの設定に移ります。

プラグインの設定

いくつか設定項目がありますが必須なのは「SSL Host」のみです。
ここにはHTTPSでアクセスした時のWordPressのURLを指定します。単純に共用SSLのホスト名のみを入力してうまくいくケースもあると思いますが、WordPressをサブディレクトリにインストールしている場合はそれらのディレクトリを含める必要があります。
例えば共用SSLホストが「test.common-ssl.com」で「ドキュメントルート/sub.domain.com/wp/」というディレクトリ構成となっている場合「https://test.common-ssl.com/sub.domain.com/wp/」(https://は省略可)と入力します。
正直Hostって表現よくないと思うなー

その他のforce〜というのは自動的リダイレクト等の設定です。上記設定が誤っていた場合直接MySQLの値をいじらないと復旧できなくなるので注意しましょう。

記事への画像挿入にて問題が発生

記事の作成は管理画面の機能のため画像を挿入時に共用SSLのURLでimgタグが生成されてしまいます。以前の記事で書いたのですが下記のようにすることで絶対パスに直すことができます。

function attachment_url_normalize($url) {
    return $url.replace(get_site_url(), 'http://note.crohaco.net/')
    $regex = '/^https?:\/\/[^\/\s]+(.*)$/';
    if (preg_match( $regex, $url, $m) ) {
        $url = $m[1];
    }
    return $url;
}
add_filter('wp_get_attachment_url', 'delete_host_from_attachment_url');

基本的にはこれで問題がないかのように思えますがサブドメインと共用SSLのドキュメントルートが異なる場合、管理画面上での画像表示ができなくなります。

/ 共用SSLのドキュメントルート
  subdomain.com/ サブドメインのドキュメントルート
    wp-files WordPressのファイルなど

絶対パスでのアクセスをやめ、URLでのアクセスに修正してみました。

function normalize_attachment_url($url) {
    $https = 'https://' . get_option('wordpress-https_ssl_host');
    $http = home_url() . '/';
    return str_replace($https, $http, $url);
}
add_filter('wp_get_attachment_url', 'normalize_attachment_url');

これが適切なのかは不明ですがとりあえず直ったようです。