301リダイレクトまとめ!http→https、www有無、URL末尾のスラッシュ有無など。

301リダイレクト記事のサムネイル画像 SEO対策

ウェブサイトのURL表記って、揺れますよね。

【httpsかhttpどっち?】
https://example.com/
http://example.com/

【wwwあるなしどっち?】
https://example.com/
https://www.example.com/

【末尾にindexファイル名あるなしどっち?】
https://example.com/
https://example.com/index.html
https://example.com/index.php

【末尾スラッシュあるなしどっち?】
https://example.com/page
https://example.com/page/

【別URLに同じコンテンツが掲載されている。どっちに統一する?】
https://example.com/page1/
https://example.com/page2/

両方のページにアクセスできるとなると、Googleさんからの評価も分散してしまってSEO的にもったいないです。
また、両方のURLをチェックしなければならないためアクセス解析に二重の手間がかかってしまいます。

これらのデメリットを避けるため、どちらかのURLに統一(=正規化)する必要があります。

この記事では、こうしたURLの正規化をするためには.htaccessをどう書けばいいのか説明します。

それでは始めます!

どちらのURLに正規化するのが好ましいか

結論は以下になります。

httpsかhttphttpsにする
www有無どちらでもよい
末尾のスラッシュ有無なしの方がいいかも
indexファイル名の有無なしにする
別URL検索結果の上位表示URL

wwwの有無でGoogleからの評価は変わらないので、どちらか好みの方に統一すればいいです。

また、indexファイル名なしのURLはindex.htmlやindex.phpなど「インデックスファイル名」が省略された形です。

▽本来のURL
404 - Not Found
▽index.htmlが省略されたURL
Example Domain

したがって、概念的にはURLを「/」で終わらせることが適切だと考えられます。
もしどちらを正規ページにするか迷うならば、末尾スラッシュありのURLをおすすめします。

ただし、ホスト名直後の「/」有無については、どちらも同一ページへアクセスできることが一般的であり、クローラーも同じものとみなします。
そのため、https://example.com から https://example.com/ への正規化を行う必要はありません。

また、将来的にサイトのリニューアルによって拡張子が変わる可能性があります。
その際にファイル名index.htmlやindex.phpがサイトのURLに含まれていると、再度正規ページを設定しなおす必要があります。
そのため、インデックスファイル名を含まないURLに正規化します。

片方のURLに正規化するための.htaccessファイルの書き方

以下のように書くことができます。
ただしワードプレスを使用している場合は少し変わってくるようなので、ワードプレスで設定したい方にはもしかしたらあまり役に立たないかもしれません。

注意点として、.htaccessファイルの編集をミスるとサイトが表示されなくなったりします。作業の際は最初にバックアップをとりましょう。

「# 」で始まるコメント行に、説明を書いてみました。

<IfModule mod_rewrite.c>
RewriteEngine on

# 【httpsに統一する】
# ▽onならHTTPS、offならHTTP
RewriteCond %{HTTPS} off
# ▽.*は正規表現で「0文字以上の任意文字」を表す
# そして^は先頭を、$は末尾を表す正規表現
# それから、$1で()内の文字列を表す。
# 例えば非正規URLがhttp://example.com/page/ならば、$1はpage1/を表す。
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

# 【wwwなしに統一】
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

# # 【wwwありに統一する場合はこちら】
# RewriteCond %{HTTP_HOST} ^example\.com$
# RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

# 【index.php(.html)なしに統一】
# ▽%{REQUEST_URI}は/page1/index.phpのようにドメイン以下のURLを表す
# また、(html|php)というのは正規表現で「htmlまたはphp」という意味
RewriteCond %{REQUEST_URI} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ https://example.com/$1 [R=301,L]

# 【末尾スラッシュありに統一】
# ▽RewriteCondを連続して記述するとAND条件。
# つまり両方を満たした場合にRewriteRuleが適用される。
# !は否定を意味する。
# それ以外の正規表現については後述の解説参照
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule ^(.*)$ $1/ [R=301,L]

# ディレクトリ単位でリダイレクト
RewriteRule ^page1/(.*)$ page2/$1 [R=301,L]

ちなみに、.htaccessの詳しい書き方はApacheチュートリアルの.htaccess解説ページに載っています。
※私は今のところ読んでいないです。
ネットにたくさん書き方の情報が転がっているので、やりたいことをやる方法はおおかた調べられるからです。
でも、詳しいことを知りたくなったらひょっとしたら読むかもしれません。

末尾スラッシュありに統一するところの解説

末尾スラッシュありに統一するところが分かりづらいと思うので補足します。
ちょっと長くなります。
飛ばしてもらっても.htaccessは書けるので、正規表現の読み方に興味がある人だけチェックしてもらえればと思います。

RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule ^(.*)$ $1/ [R=301,L]

まず、1行目の意味は、%{REQUEST_URI}の末尾にスラッシュが無いならば、です。


例えば
https://example.com/page1
にアクセスしたとします。
この場合%{REQUEST_URI}とは「/page1」のことなので、「/page1」の末尾にスラッシュが無いならば、という意味になります。

次に2行目の意味は、%{REQUEST_URI}が「!.[^/.]+$」であれば、です。

「!\.[^/\.]+$」であれば

↓

(!は正規表現で否定の意味です。)
「\.[^/\.]+$」でなければ

↓

($は正規表現で文字列の最後を表します。)
最後が「\.[^/\.]+」で終わっていなければ

↓

(「\.」はドット「.」をエスケープした後の表記です。
ドット「.」単体だと正規表現において「任意の1文字」という意味になってしまうので、ただのドット文字であると知らせるためにバックスラッシュ「\」でエスケープします。
ここでは見やすくするため特別に「\.」を「.」と書き直してみます。)
最後が「.[^/.]+」で終わっていなければ

↓

(「+」は直前の文字の1回以上の繰り返しです。)
最後が「.から始まって、[^/.]を1回以上繰り返した文字列」で終わっていなければ

↓

([abc]はaかbかcという意味です。
[^abc]はその否定で、aでもbでもcでもない1文字という意味です。)
最後が「.から始まって、「/でも.でもない文字」を1回以上繰り返した文字列」で終わっていなければ

ここまで来ました。
「.から始まって、「/でも.でもない文字」を1回以上繰り返した文字列」とはなんでしょうか。
例えば「.aaa」とか「.aiueo」とかです。
「.aaa.bcde」とか「.aiu/e/o」とかは該当しません。

例えば
https://example.com/page1/index.php
にアクセスしたとします。
%{REQUEST_URI}は/page1/index.phpです。
この文字列にある最後のドットは、インデックスファイル名index.phpの中にあるドットです。
「.php」は「.から始まって、「/でも.でもない文字」を1回以上繰り返した文字列」に該当します。
もとの条件をもう一度見てみましょう。

最後が「.から始まって、「/でも.でもない文字」を1回以上繰り返した文字列」で終わっていなければ

つまり、最後が「.から始まって、「/でも.でもない文字」を1回以上繰り返した文字列」で終わっている、に該当するやつは弾くのです。
なので、最後が「.php」で終わるものも弾きます。

晴れて/page1/index.phpが条件から弾かれました。
なので、
https://example.com/page1/index.php
にアクセスしても、このリダイレクトは起こりません。お疲れ様でした。

ちなみに、末尾がindex.phpのものとindex.htmlのものだけをはじきたいのであれば、こんな複雑な書き方をする必要はありません。

RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !(index.php|index.html)$
RewriteRule ^(.*)$ $1/ [R=301,L]

で十分です。

でも、アクセス解析などのためURL末尾にパラメータを付与することもあるでしょう。

URLの一例:https://example.com/page?name=satou&age=30

こういった場合も弾いてほしければ、「!.[^/.]+$」で一括で設定してしまうのが早いのです。

長くなりましたが、以上が末尾スラッシュありに正規化するときの.htaccessの書き方の説明でした。

WordPressの場合.htaccessファイルを編集する必要があるかどうかは筆者にはまだよく分からない

このサイトはワードプレスで出来ています。
筆者も.htaccessの設定をしようと試みました。

ですが、どうやらワードプレス側で最初からURLの正規化的な何かをしておいてくれてるような気がするのです。

https://meobird.xyz/post-183/index.php
にアクセスすると
https://meobird.xyz/post-183
に飛ぶ。

https://meobird.xyz/post-183/
にアクセスすると
https://meobird.xyz/post-183
に飛ぶ。

あれっ、もしかして.htaccessを私は編集しなくていいの……?
でも、詳しいことは分かりません。

ワードプレスの場合、.htaccessに最初から以下のような記述がなされています。
これが何か鍵を握っていると思います。

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

ただ、この記述が何をしているのかは、筆者の勉強不足によりまだ分かっていません。
また分かったら記事にするかもしれないし、しないかもしれません。

そんな感じで最後はお茶を濁しながら終わります。
最後までお読みいただきありがとうございました!

↓こちらの連載記事もよろしくね!

コメント

タイトルとURLをコピーしました