SEOに効くと言われているURLの統一化を実施したいと思います。
具体的には、以下の事を行います。
- www無しに統一
- httpsで統一
リダイレクトをする方法は、meta refrashやphpで書いたりすることもできますが、一番簡単な方法は.htaccessを利用する方法です。
.htaccessは置かれた階層以下全てに適用されます。
.htaccessのリダイレクトで活躍するRewriteCond
RewriteCond は、URL書換えを行うルール条件を指定します。そのためRewriteRuleの前に記述する必要があります。
RewriteRule は RewriteCond のルールを満たした場合に適用されます。
文字だけだとわからないと思うので、実際に書いてみます。
まずはWWWを無しに統一します
www.sample.com/book/2015best.html というURLでアクセスがあった場合に、https:sample.com/book/2015best.htmlというURLにリダイレクトします。
次の記載方法で、実現可能です。
RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.sample\.com$ RewriteRule ^(.*)$ https://sample.com/$1 [R=301,L]
.htaccessに書いたリダイレクトを解説。
RewriteEngine
RewriteEngine on
Rewrite機能オンにします。これをオンにしないとURLの書き換えができません。
記載は1回でOKです。
RewriteCond
RewriteCond %{環境変数} 条件(正規表現で記述)
RewriteCond では、RewriteRuleを適用する条件を書きます。
環境変数は{}で囲えばOKです。環境変数は様々な種類がありますので、一覧を一番最後に記載しておきます。
正規表現は、とりあえずURLの先頭は^ 末尾は$ .(ピリオド)は\(バックスラッシュ)でエスケープします。
ピリオドをなぜバックスラッシュでエスケープするかというと、正規表現でピリオドは、任意の1文字という意味を持っているからですです。つまり、任意の文字では無く、URLのピリオドと認識させるためです。
あらためて今回のRewriteCondを見ると、ホスト名が、www.sample.com だったら RewriteRule を適用というRewriteCondです。
RewriteCondは下記のように続けて複数記載する事が可能です。この場合、AND条件になります。
RewriteCond %{環境変数} 条件 RewriteCond %{環境変数} 条件
又はとったOR条件の場合は以下のようになります。
RewriteCond %{環境変数} 条件 [OR] RewriteCond %{環境変数} 条件
[OR]以外には、NCというのも存在します。NCは大文字と小文字を区別しなくなります。
ORとNCを両方記述する場合は次のようにカンマでつなげます。[OR,NC]
RewriteRule
RewriteRule パターン(正規表現で記述) 置換URL [フラグ]
RewriteRluleはまず、置換対象になるURLを指定し、その後に置換後のURLを記述します。
置換対象は、個別のURL、特定のディレクトリ以下等、正規表現を利用して指定することが可能です。
上記の置換対象のURL(ドメインよりも後ろのURL)は正規表現で書いてあります。
^先頭 と $末尾 の間に .(ピリオド)と*(アスタリスク)があります。
ピリオドは任意の1文字、アスタリスクは前の文字を0回以上繰返す、という意味になります。
つまり今回は、どのようなURLでも置換対象になります。
ピリオドとアスタリスクを () で囲ってありますが、これはグループ化といいます。
グループ化したものは、置換後のURLにある$1にそのままもってくることが可能です。
フラグにはR これはRedirectの意味で、301をつけているので301リダイレクトになります。
LはLastで、ルールがこれで完了し、その後に続くルールは実行しないことを意味します。
httpできたものをhttpsに301リダイレクト
RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://sample.com/$1 [R=301,L]
RewriteCondで 変数名 HTTPS を指定し、HTTPSの状況を取得します。offだった場合の下のRewriteRuleを適用します。
RewriteRule は前述したとおり、何にでもマッチする記述です。
httpsとwww無しで統一するには
RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.sample\.com$ RewriteRule ^(.*)$ https://sample.com/$1 [R=301,L] RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://sample.com/$1 [R=301,L]
変数一覧
情報のタイプ | 変数 | |
HTTP headers: | HTTP_ACCEPT | ブラウザの言語タイプ |
HTTP_COOKIE | クッキー情報 | |
HTTP_FORWARDED | プロキシ情報 | |
HTTP_HOST | サーバーのホスト名 | |
HTTP_PROXY_CONNECTION | プロキシを経由しているか否か | |
HTTP_REFERER | 参照元URL | |
HTTP_USER_AGENT | ユーザーエージェント | |
server internals: | DOCUMENT_ROOT | ドキュメントルートのパス |
SERVER_ADDR | サーバーのアドレス | |
SERVER_ADMIN | サーバー管理者情報 | |
SERVER_NAME | サーバー名 | |
SERVER_PORT | サーバーのポート番号 | |
SERVER_PROTOCOL | プロトコルバージョン | |
SERVER_SOFTWARE | サーバーソフトウェア | |
PATH_INFO | パス情報 | |
QUERY_STRING | クエリ文字列 | |
REMOTE_ADDR | リモートアドレス | |
REMOTE_HOST | リモートホスト名 | |
REMOTE_IDENT | リモートユーザーのID | |
REMOTE_USER | リモートユーザー名 | |
REQUEST_METHOD | リクエストメソッド | |
SCRIPT_FILENAME | スクリプトファイル名 | |
date and time: | TIME_YEAR | 年 |
TIME_MON | 月 | |
TIME_DAY | 日 | |
TIME_HOUR | 時 | |
TIME_MIN | 分 | |
TIME_SEC | 秒 | |
TIME_WDAY | 曜日 (0:日 ~ 6:土) | |
TIME | 年月日時分秒 (例:20130123123456) | |
specials: | API_VERSION | APIバージョン |
HTTPS | HTTPSでのアクセスか否か | |
IS_SUBREQ | サブリクエストか否か | |
REMOTE_ADDR | リモートアドレス | |
REQUEST_FILENAME | リクエストされたファイル名 | |
REQUEST_SCHEME | httpかhttpsを判断 | |
REQUEST_URI | リクエストURI | |
THE_REQUEST | リクエスト文字列 |
参考にさせて頂いたサイト
https://httpd.apache.org/docs/2.2/rewrite/intro.html#introduction
https://www.cudo29.org/regexp.html
質問などあればお気軽に!