SEO対策として、URLのindex.html、index.phpの有無を統一することはよくあります。
今回は「.htaccess」を使ってindex.html、index.php無しに統一する方法をメモしておきます。
スポンサーリンクhtaccessでindex.html、index.php無しに統一する方法
<IfModule mod_rewrite.c> RewriteEngine on # index.html/index.phpなしで統一 RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$ RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L] </IfModule>
↑こちらを「.htaccess」に追記すると、URLの最後の「index.html」や「index.php」を除外できます。
※編集する際はバックアップしてからお試しください
実装は以上で完了となります。
以下、簡単にですが、一通り説明を書いておきますので、興味のある方はご覧ください。
※ちなみにメインは4、5行目です
1行目と7行目(IfModule)
<IfModule mod_rewrite.c> ・・・ </IfModule>
モジュール(mod_rewrite.c)が使える場合に「・・・」の処理を行います。言い換えると、モジュールが使えない場合は、「・・・」の処理は何も行われないということです。
基本的に「mod_rewrite」を利用できる環境がほとんどですが、サーバによっては利用できない場合もあるかもしれません。
もし動作しない場合は、「htaccessの設定ミス」または「モジュール(mod_rewrite.c)が使えない」が考えられます。htaccessに問題がなさそうな場合は、レンタルサーバやサーバ管理者にご確認ください。
2行目(RewriteEngine on)
RewriteEngine on
「mod_rewrite」を有効にします。
3、4行目(RewriteCond)
# index.html/index.phpなしで統一 RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
3行目はコメントです。
4行目は、アクセスしたURLの末尾が「/index.html」または「/index.php」で終わるならば、という処理になります。
各記号の説明をしますね。不要な方は5行目(RewriteRule)まで飛ばしてください。
RewriteCondとは?
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「RewriteCond」とは、半角スペース以降に条件(%{REQUEST_URI} ^.*/index\.(html|php)$など)が書かれていて、その条件が満たされた場合に次の行の処理を行うという命令です。
%{REQUEST_URI}とは?
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
%{REQUEST_URI}とは「REQUEST_URI」という環境変数を使うための形です。「%{}」で囲むと環境変数の値を利用できます(環境変数は他にもいくつかあります)。
環境変数「REQUEST_URI」の値はURLのドメインを除いた部分です。このページの場合ですと、URLが「https://lucklog.info/htaccess-url-index-remove/」なので、「/htaccess-url-index-remove/」となります。
「¥」とは?(正規表現)
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「¥」はエスケープ文字です。「\.」は「.」という文字を指します。「.」のように文字以外の機能を持つ文字を文字として扱いときに「\.」のように文字の前にエスケープ文字を付けます。
「.」とは?(正規表現)
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「.」は任意の1文字です。つまり何でもOKという意味です。※「a」「1」「-」など何でもOKです
「*」とは?(正規表現)
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「*」は、直前の文字が 0回以上 繰り返すというものです。例えば、「ap*le」であれば、「*」の直前の文字は「p」なので、0回だと「ale」、1回だと「aple」、2回だと「apple」となります。
「.*」の場合だと、どんな文字列でもとなります。
(html|php)とは?(正規表現)
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「(html|php)」は「html」または「php」となります。
「^」とは?(正規表現)
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「^」は直後の文字が行の先頭にある場合にマッチします。よって、「^.*」は先頭が何かの文字列(なんでもOK )で始まる文字列となります。
「$」とは?(正規表現)
RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$
「$」は直前の文字が行の末尾にある場合にマッチします。よって、「/index\.(html|php)$」は末尾が「/index.html」または「/index.php」で終わる文字列となります。
5行目(RewriteRule)
RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L]
アクセスしてきたURLの「~index.html」または「~index.php」を取り除いたURLにリダイレクトします。
本ページであれば、「https://lucklog.info/htaccess-url-index-remove/index.html」でアクセスされた場合、「https://lucklog.info/htaccess-url-index-remove/」にリダイレクトされるということです。
以下まだ説明していない各機能・記号の説明です。
- RewriteRule
- URL の書き換えを行います。1つ目のスペースの後の「条件パターン」に一致する URL を、2つ目のスペースの後の「置換文字列」で書き換えます。
- %{HTTP_HOST}
- 「HTTP_HOST」という環境変数を使うための形です。「%{}」で囲むと環境変数の値を利用できます(環境変数は他にもいくつかあります)。
※HTTP_HOST=ホスト名(下のオレンジボックス参照)
- $1
- パターン部分の一つ目の「()」の中の文字列を使います。
パターン部分とは、今回の場合だと「^(.*)$」となっている部分です。この1つ目の「()」内にはドメインより後ろの文字列がフルで入っています。
例をあげると「https://www.lucklog.info/htaccess-url-www-remove」であれば、「htaccess-url-www-remove」になります。
※ドメイン直後の「/」は含みません - [R=301,L]
- R=301は、リダイレクトを行います。ちなみに、URL変更を伝えるので、今までのページの評価は落ちません。
Lは、ここで終了という意味です。
「https://」~最初の「/」までの文字列がホスト名(HTTP_HOSTの値)になります。
例えば、URLが「https://lucklog.info/aaa」であれば、「lucklog.info」がホスト名、URLが「https://www.lucklog.info/aaa」であれば「www.lucklog.info」となります。
※phpで取得して確認しました
まとめ
ゴチャゴチャと書きましたが、アクセスされたURLに「index.html」または「index.php」が付いていたら外してリダイレクトするよということです。
<IfModule mod_rewrite.c> RewriteEngine on # index.html/index.phpなしで統一 RewriteCond %{REQUEST_URI} ^.*/index\.(html|php)$ RewriteRule ^(.*)index.(html|php)$ https://%{HTTP_HOST}/$1 [R=301,L] </IfModule>
↑こちらを「.htaccess」に追記すると、URLの最後の「index.html」や「index.php」を除外できますので、必要な方はコピペしてご利用くださいね。
※バックアップはお忘れなく
ちなみに、下記のようなページを作成したのですが、URLを「index.php」無しに統一したかったので、今回の記事を書きました。
https://colorcode-to-rgb.luck-jp.com/
以上、誰かのお役に立てれば幸いです。
スポンサーリンク