htaccessでURLの正規化をする例
- 最終更新:
- 公開日:
URLの正規化をApacheのサーバー上でhtaccessファイルで行う場合の例として、筆者がロリポップレンタルサーバーで設置した事例を紹介します。
htaccessの書き方に問題がないはずなのに何故かうまくいかない場合には、設置するフォルダの階層を考えてみると良いかもしれません。
今回のフォルダ構造の例
レンタルサーバーを借りて、与えられたフォルダをルートとして、その直下に一つのフォルダを作り、そこにドメインを割り当てていました。
そして、一つのhtaccessに、URLの正規化のために行う「http → https」「www → なし」「index.html → なし」の3つのRewriteRuleを書きました。
書き方としては、ロリポップのマニュアルを参考にしました。∗01)
ところが、そのhtaccessをルートに置いても、トップに置いても、いずれかの処理がうまくいかないという状態になりました。
書き間違いがあるのかとチェックしましたが、どうもそうではないようです。
分割して配置を変えると成功
結論としては見出しの通り、分割して配置を変えるとうまく動作しました。
フォルダ構成など環境によって異なる可能性もあるので、必ずしもこれが正解だとは言えないのですが、とりあえず私が上手くいったのは下のような感じです。
- root ← 「wwwなしに統一」
- top ← 「httpsに統一」「index.htmlなしに統一」
つまり、htaccessがうまく動作しないときには、記載内容をチェックするのはもちろんなのですが、どの処理をどの場所に配置するのかということも考えたり試したりしてみると、問題解決できるかもしれないということです。
htaccessの記載例
今回のhtaccessの記載例を一応掲載しておきます。
サイトのドメインは、自サイトのものに読み替えてください。
rootに設置したhtaccess
RewriteEngine on
#wwwなしに統一する
RewriteCond %{HTTP_HOST} ^www\.zlllby\.com$
RewriteRule ^(.*)$ https://zlllby.com/$1 [R=301,L]
topに設置したhtaccess
RewriteEngine on
#index.html無しのURLに統一する
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html https://zlllby.com/$1 [R=301,L]
#httpをhttpsに統一する
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
関連して、htaccessの編集時に忘れがちなことに、最終行にも改行が必要な(最終行は空行になる)ことや、ファイル名の頭にドットをつけるといったことがあります。
また、チェックする際に前のままで表示されると困るので、変更してテストする都度、ブラウザのキャッシュを削除してみるのも良いかもしれません。