今まで無料のドメインを使っていたのですが、あることを契機に有料ドメインに変更するにあたって、ハマった話とその解決方法についてお話します。
mod_rewriteとは
mod_rewriteとは、Apache上で利用できる機能の1つです。
一言で言えば、リダイレクト機能になります。
htmlやJavaScriptでもリダイレクト機能は実装することができますが、一般的かつGoogleにも推奨されている方法がWebサーバによるリダイレクトです。mod_rewriteはサーバによるリダイレクト手法のうちの1つになります。
― 【unitopi】Webページをリダイレクトする3つの方法とベストプラクティス
よくあるのは強制https化だったり、URLの正規化(www有無など)だったりします。
かくいう私も強制https化でmod_rewriteを使っています。
しかし、同じ要領でドメインの変更も大したことないだろうと思っていたら、痛い目を見ました。
httpd.confと.htaccessの罠
基本的にmod_writeを記述するのはhttpd.conf
または.htaccess
のどちらかになります。
人によってはmod_write.confを作成したりする例もあるみたいです。
httpd.conf
と.htaccess
の違いはRewriteが行われる順番と処理速度です。
簡単にいうと、httpd.conf
でRewriteされたあと、.htaccess
でRewriteが行われます。
また、それぞれのRewiteの処理速度を比較すると、httpd.conf
> .htaccess
となり、httpd.conf
の方が早いです。
理由は.htaccess
が再度リクエストをサーバに投げるからなのですが、詳しくはこちらを見てください。
― 【ブログ】「.htaccess」と「httpd.conf」での設定による違い
私の場合、この関係を理解していなかった上に、.htaccess
ファイルにmod_writeを記述していたのを忘れていて、httpd.conf
を見ながら小一時間唸っていました。
やっぱり、備忘録は必要なんだなぁ、と実感
httpsの罠
タイトルどおり、https周りでつまづきました。
失敗例
まず、失敗したhttpd.conf
を載せます。
<IfModule mod_rewrite.c>
RewriteEngine On
# (1) sample.tk -> sample.com:443
RewriteCond %{HTTP_HOST} ^sample.tk
RewriteRule ^(.*)$ https://sample.com%{REQUEST_URI} [R=301,L]
# (2) *:80 -> *:443
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
ドメインをtk
からcom
に変えるためのRewriteRule
と、
強制的にhttpsにアクセスさせるための`RewriteRuleの2つがあります。
(1)で、ホスト名が旧ドメインだった場合は新ドメインのhttpsにアクセスします。
(2)で、ドメインが新旧に関わらず、httpでのリクエストはすべてhttpsにリダイレクトします。
上手くいきそうに見えます。
しかし、実際にアクセスしてみると…
http://sample.tk -> https://sample.com (成功)
https://sample.tk -> https://sample.tk (失敗)
http://sample.com -> https://sample.com (成功)
なぜか、httpsのときだけ、リダイレクトされない??
原因と対処法
原因はずばり、httpd.conf
にあります。
httpd.conf
の上の方、40行目あたりに気になる記述があります。
...
Listen 80
...
はい、もうお分かりですね。
httpd.conf
は基本的に80ポート、つまりhttp通信にしか適用されません(そりゃそうだ)。
つまり、httpd.conf
にいくらhttpsに関する記述をしたところで意味がないわけです。
というわけで、別ファイルにRewrite内容を書きましょう。
<VirtualHost *:443>
ServerName tkl-craft.tk:443
RewriteEngine on
RewriteCond %{HTTP_HOST} ^tkl-craft.tk
RewriteRule ^(.*)$ https://tkl-craft.com%{REQUEST_URI} [R=301,L]
</VirtualHost>
VirtualHostについては省略します。
内容は失敗例のhttpd.conf
で書いたものと全く同じです。
ホスト名が旧ドメインだったら新ドメインにRewriteするというものです。
これでようやく、httpsに対してもRewriteを行うことができました。