index.htmlファイルをサーバーのドキュメントルートにアップロードしてからのことです。
ブラウザにURLをhttps://○○○.comのようにドメインだけでアクセスして表示確認するとindex.htmlの内容がブラウザに表示します。
一方でhttps://○○○.com/index.htmlでアクセスした場合にはindex.htmlありのURLで同じindex.htmlの内容が表示します。
2つのURLで同じindex.htmlを表示できてしまうアクセス方法ではなく、index.htmlをトップページとして一つのURLで表示したいため、index.htmlなしのURLに統一してアクセスできるようにすることにしました。
index.htmlなしでアクセスできるようにするには
「.htaccess」というファイルにコードを記述することでindex.htmlなしのURLでアクセスできるようにすることができます。
.htaccessファイルは使用しているWebサーバーがApacheで動いていないと使用できないので、まずは使用しているWebサーバーがApacheによって動いているかを確認します。
Apacheを使用している場合は、サーバーのホームページを公開するドキュメントルートの階層に.htaccesファイルがあるかどうかを確認します。
サーバーのドキュメントルートに.htaccessファイルがあれば.htaccesファイルをFTPソフトでローカルにダウンロードしてテキストエディタで開いた.htaccessファイルに以下のコードを記述します。
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://○○○.com/$1 [R=301,L]
</ifmodule>
https://○○○.comの部分にはindex.htmlなしにしたいサイトのURLが入ります。
コードを記述して.htaccessファイルを保存したら、Webサーバーのドキュメントルートに編集した.htaccessファイルをアップロードします。
.htaccessファイルをアップロード後にブラウザでhttps:/○○○.com/index.htmlのURLでアクセスするとhttps://○○○.comのようにindex.htmlなしのURLでアクセスできます。
index.htmlなしにリダイレクトしてアクセス
index.htmlありのURLでアクセスしてもindex.htmlなしのURLでアクセスできるようになったのは.htaccessに記述したコードがURLのリダイレクト処理をしているからです。
リダイレクトは「転送」のことで、index.htmlありのURLをindex.htmlなしのURLに転送してアクセスできるようにする「転送処理」を.htaccessに記述したコードが実行しています。
「index.htmlなしにリダイレクトしてアクセスする」という処理がイメージしづらい場合は、電話の転送や郵便物の転送をイメージしてみると分かりやすいかもしれません。
URLをindex.htmlなしにする.htaccessの書き方
URLをindex.htmlなしにする.htaccessの書き方も覚えておくと良いです。
以下のコードは記事の冒頭で紹介した.htaccessに記述したindex.htmlありのURLをindex.htmlなしのURLにリダイレクトしてアクセスできるようにするコードです。
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://○○○.com/$1 [R=301,L]
</ifmodule>
.htaccessの書き方は<ifmodule mod_rewrite.c>と</ifmodule>で囲んだ中にリダイレクトの処理を記述します。
<ifmodule mod_rewrite.c>でmod_rewriteが利用できるかどうかを確認しています。
RewriteEngine On
RewriteEngineはURLの書き換えを行うエンジンで、RewriteEngine Onと書くとURL の書き換え処理が有効になります。
Offを書くと<ifmodule mod_rewrite.c>と</ifmodule>の中に記述したリライト処理は実行されません。今回の場合ならindex.htmlなしのURLでアクセスできるようにしたリライトは無効になりindex.htmlなしのURLでアクセスできます。
index.htmlなしのURLでアクセスできるようにする.htaccess内でのリダイレクト処理「RewriteCond」「RewriteRule」の記述も次で覚えてみましょう。
RewriteCondでURLの書き換え条件を指定
「RewriteCond」は.htaccessファイルの<ifmodule mod_rewrite.c>と</ifmodule>で囲んだ中に記述をして、リダイレクト処理をする「URLの書き換え条件」を指定するものです。
Condを直訳すると「条件」なので「リライト条件を指定」する部分だと理解しやすくなります。
RewriteCond %{THE_REQUEST} ^.*/index.html
RewirteCondはサーバ変数を参照して、それが指定した正規表現のパターンと一致すると次の条件を実行するという命令です。
index.htmlなしのURLでアクセスできるようにするときに指定するRewirteCondでのサーバ変数は「THE_REQUEST」で、ユーザーのブラウザからサーバーに送られてきたHTTPリクエストの完全なものを取得して、正規表現のパターン「^.*/index.html」と一致すると次のURL書き換え条件を実行するという指定です。
正規表現は難しくて調べました。
^ は文字の始まりを意味します。
.* は任意の文字の連続なので、全ての文字列にマッチします。
例えばブラウザからサーバーに送られてきたhttps://○○○.com/index.htmlをサーバー変数「THE_REQUEST」で取得して、後方の「^.*/index.html」のパターンと一致してる場合は、次のRewriteRuleの処理に進みます。
RewriteRuleで条件を満たした場合に実行
index.htmlなしのURLでアクセスできるようにする.htaccessでのRewirteCondの条件にURLが一致した場合、つまりリクエストしたindex.htmlありのURLと一致したとき、index.htmlなしのURLにリダイレクト処理を実行するRewriteRuleの条件を記述します。
RewriteRuleは次の書式の通りに書きます。
RewriteRule 正規表現パターン 置換パターン オプション
RewriteRule ^(.*)index.html$ https://○○○.com/$1 [R=301,L]
上のコードでindex.htmlの前に書いている^(.*)$ は正規表現で「^」が行頭、「$」が行末を示しています。
(.*)はあらゆる文字列を対象にする表現です。
置換パターンにはリダイレクト先のURLを書きます。今回index.htmlなしのURLにindex.htmlありのURLを飛ばすのでhttps://○○○.comのようにURLを記述します。
最後に[R=301,L]です。
[R=301] はHTTPステータスコード301を返してリダイレクトすることを表すフラグです。301リダイレクトは恒久的な転送なため、indedx.htmlありのURLでアクセスしたページは、ずっとRewriteRuleの置換パターンで指定したURLに転送されます。
[L] はURLの書換え処理を終了します。この2つのフラグをまとめて [R=301,L] と記述します。
index.htmlなしhttpとwww付きのアクセスは正規化
index.htmlなしのURLでアクセスできるようにする記述を.htaccessのファイルに記述したことでhttps://○○○.com/index.htmlのURLでアクセスするとindex.htmlなしのURLでアクセスできるようになっているかと思います。
- http://○○○.com/
- http://www.○○○.com/
少しおせっかいなことかもしれませんが上記のように、URLをindex.htmlなしのドメインだけのURLにしてhttpsではなくhttpとhttp://www付きでアクセスするとどうなるでしょうか?
もし「安全ではない接続」になってしまう場合にはindex.htmlなしでhttpとwww付きのURLは正規化をして「安全な接続」でアクセスできるようにするのが良いです。
<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://○○○.com/$1 [R=301,L]
</ifmodule>
上記のコードは今回紹介したindex.htmlなしのURLでアクセスできるようにする記述を含めた、httpsの安全なページにリダイレクト処理をするコードです。
すでにindex.htmlなしのURLでアクセスできるリダイレクト処理の記述をしている場合には、<ifmodule mod_rewrite.c>と</ifmodule>の部分と、中の記述を一度削除してコピペで編集し直します。
すると
index.htmlなしでhttpとwww付きのURLからのアクセスはhttpsに統一され正規化。
index.htmlありの場合はindex.htmlなしのURLでアクセスできるようにすることができます。
つまり
- http://○○○.com/
- http://○○○.com/index.html
- http://www.○○○.com/
- http://www.○○○.com/indedx.html
- https://○○○.com/index.html
上記のURLへのアクセスは
https://○○○.com/の一つのURLに転送され、安全で統一されたページにアクセスできます。
1からサイトを立ち上げた場合には.htaccessにリダイレクト処理の記述がないかと思うので、その場合はindex.htmlなしのURLでアクセスできるようにする処理だけでは不十分かもしれませんので最後に紹介してみました。