www有り無し統一してhttps化する .htaccessのスマートな書き方

以前にも
・www有無
・常時SSL化の際にhttpからhttpsへのリダイレクト
のことを書いていました。

しかしこの度、エックスサーバー にて新しいサブドメイン(www以外)を設定した時に.htaccessの記述内容が原因で、サブドメインの設定がうまくいかなかったので、修正しました。

エックスサーバーでのサブドメイン設定

まず、エックスサーバーでサブドメインを設定について。

詳しい設定方法はエックスサーバーのマニュアルにあります。

サブドメイン設定
https://www.xserver.ne.jp/manual/man_domain_subdomain_setting.php

上記ページにも書かれていますが、example.comのサブドメイン(例:test)を設定すると、

/public_html/example.com/test/

の様に、example.comにtestというフォルダが生成され、そこにデータをアップし

test.example.com

でアクセスすることになります。

でもこのままだと

example.com/test

でもアクセスできてしまうので、test.example.comでのみアクセスする様に.htaccessを設置します。

.htaccessを設置するのは、testディレクトリです。

SetEnvIf Host "^test.example.com$" host
order deny,allow
deny from all
allow from env=host

test.example.comの部分は任意のドメインに書き換えます。

エックスサーバーではサブドメインの作成時にSSLの設定も同時にできますが、SSL設定が失敗した場合は手動でもう一度設定する必要があります。

あと、サブドメインの内容が検索エンジンにクロールされたくない場合は、アクセス制限も必要です。

以上でサブドメインの設定は完了です。

サブドメインでアクセスできない

エックスサーバでサブドメインを設定すると1時間程度で設定が有効になる様です。

でもいくら時間がたっても、サブドメインにアクセスすると

example.com/test

に飛ばされてしまう。。。。

.htaccessの設定が原因でした

カスタマーサポートに確認したところ、すでに設定していた.htaccessの転送設定が原因とのことでした。

.htaccessには、wwwありに統一、httpはhttpsにリダイレクトする様に記述していました。

修正前の.htaccess

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*) https://www.example.com/$1 [R=301,L]

上記の様な記述を以下の様に修正しました。

修正後の.htaccess

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

これでサブドメインでアクセスすることができる様になりました。。。。

もっとスマートに.htaccessに記述する方法

上の方法だと、ドメインが変わればその度に書き直さないといけないということになります。もっと汎用的にするには・・・・

こちらのページが詳しく説明されていて参考になります。

.htaccessでhttps化かつwwwありに統一するクールな方法
https://www.garunimo.com/program/p35.php

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

www無し&httpからhttpsへリダイレクトするのは以下

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

これなら汎用的で、毎回書き換えなくてすみますね。