1. kiyocy24

    Posted

    kiyocy24
Changes in title
+【mod_rewrite】httpsとhttpd.confと.htaccessでハマった話
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,105 @@
+今まで無料のドメインを使っていたのですが、あることを契機に有料ドメインに変更するにあたって、ハマった話とその解決方法についてお話します。
+
+[mod_rewriteとは](https://qiita.com/69d4c40bb1b2625af254/mod_writeとは)
+[httpd.confと.htaccessの罠](https://qiita.com/69d4c40bb1b2625af254/httpd.confと.htaccessの罠)
+[httpsの罠](https://qiita.com/69d4c40bb1b2625af254/httpsの罠)
+
+# mod_rewriteとは
+mod_rewriteとは、Apache上で利用できる機能の1つです。
+一言で言えば、リダイレクト機能になります。
+
+htmlやJavaScriptでもリダイレクト機能は実装することができますが、一般的かつGoogleにも推奨されている方法がWebサーバによるリダイレクトです。mod_rewriteはサーバによるリダイレクト手法のうちの1つになります。
+― [【unitopi】Webページをリダイレクトする3つの方法とベストプラクティス](http://unitopi.com/web-redirect/)
+
+よくあるのは強制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」での設定による違い](http://ysklog.net/mod-rewrite/related05.html)
+
+私の場合、この関係を理解していなかった上に、`.htaccess`ファイルにmod_writeを記述していたのを忘れていて、`httpd.conf`を見ながら小一時間唸っていました。
+
+やっぱり、**備忘録は必要**なんだなぁ、と実感
+
+# httpsの罠
+タイトルどおり、https周りでつまづきました。
+
+## 失敗例
+まず、失敗した`httpd.conf`を載せます。
+
+```title: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行目あたりに気になる記述があります。
+
+```title:httpd.conf
+...
+Listen 80
+...
+```
+はい、もうお分かりですね。
+`httpd.conf`は基本的に80ポート、つまりhttp通信にしか適用されません(そりゃそうだ)。
+
+つまり、`httpd.conf`にいくらhttpsに関する記述をしたところで意味がないわけです。
+というわけで、別ファイルにRewrite内容を書きましょう。
+
+```title:rewrite.conf
+<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を行うことができました。
+
+
+# 参考リンク
+- [【unitopi】Webページをリダイレクトする3つの方法とベストプラクティス](http://unitopi.com/web-redirect/)
+- [【ブログ】「.htaccess」と「httpd.conf」での設定による違い](http://ysklog.net/mod-rewrite/related05.html)
+- [【Qiita】Apacheでhttpをhttpsに強制リダイレクト](https://qiita.com/yoshizaki_kkgk/items/123e766229fd3910530e)
+- [【WEB ARCH LABO】Apache RewriteCond の基礎知識](https://weblabo.oscasierra.net/apache-rewritecond-base/)
+