.htaccess
centos7

.htaccess で URLの正規化(www削除)ができなくて泣きを見た話

いきなり結論から

VPSでバーチャルホストを設定するときは、*.confファイルに ServerAlias もちゃんと書こうね!

*.conf
<VirtualHost *:80>
    ServerName sample1.net
    ServerAlias www.sample1.net ← これ大事
    DocumentRoot /var/www/sample1.net
</VirtualHost>

そしてこうだ!!

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.sample1\.net
RewriteRule ^(.*)$ http://sample1.net/$1 [R=301,L]

どういうこと?

タイトルのままなんですが、一つのVPSサーバーで複数サイトを運営しており、その中の一つをSSL化した際、.htaccessを使ってURLの正規化(http → https)をやってたら、wwwも無くしてという話になりました。

いろんなサイトの .htaccessの書き方を見てやってみました。

RewriteEngine On

# httpsに統一
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# wwwなしに統一
RewriteCond %{HTTP_HOST} ^www.sample1\.net
RewriteRule ^(.*)$ http://sample1.net/$1 [R=301,L]

うーん、うまくいかない。。

起こったこと

以下のことが起こりました。

やったこと

.htaccessの記述順が影響しているのではと思い、httpsとwww削除の記述を入れ替えて見ましたが、変わりありませんでした。

.confファイルの記述が間違っているのかと思い、同じVPS上で正しく表示されている.confファイルと見比べて見ましたが、特に変わったところは見つかりませんでした。。。

ひょっとして、www付きのURLが紐づいてないんじゃね?

あーでもない、こーでもないと2~3時間がすぎました。。

https://sample.net はOKで、https://www.sample.net だとダメ。
www付きは同じVPS上の違うドメインの画面が表示されてしまう。
もしかして、www付きのドメインが紐づいてない??

.confファイルに ServerAlias を追加

ServerAliasServerName 以外のホスト名でもアクセスを受け付けたい場合に記述します。
なくても動いていたので、そのままにしてましたが、もしやこれが原因なのでは?と思い、以下のように修正しました。

*.conf
<VirtualHost *:80>
    ServerName sample1.net
    ServerAlias www.sample1.net ← 追加
    DocumentRoot /var/www/sample1.net
</VirtualHost>

.htaccessは特にいじらず、再度 https://www.sample.net にアクセスすると・・・。
できた!!!

無事、wwwなしURLにリダイレクトできました。

知ってる人からしたら、当たり前のことかもしれませんが、これだけのために泣きを見てしまったので、備忘録と自分への戒めとして残します。

もし同じことでなハマってる人の助けになれば幸いです・・・。