ブログのパーマリンク変更に伴い301リダイレクトしないといけなくなったので、やり方を調べてみました。
301リダイレクトのやり方自体はそんなに難しくなかったんですが、.htaccessの使い方は難しかったです。リダイレクトするにあたって最低限必要な知識はまとめてあるので参考にしてみてください。
もくじ
301リダイレクトと302リダイレクト
例えば、あるURL「https://sample.com/hoge」にアクセスがあった時に「https://sample.com/hage」に転送する処理のことをリダイレクトというらしいです。
パーマリンクを変更したときなどに必要になってくる処理です。
301リダイレクトというのは恒久的なURLの変更をする時に使います。302リダイレクトは一時的な変更で、あとで戻すことを前提としています。
wordpressを運営していて、パーマリンクを変更した場合に必要なのは301リダイレクトです。今回はこの301リダイレクトのやり方をメモしておきます。
リダイレクトしないとページの評価がゼロになる!
Googleによるサイトやページの評価はURLと対応させているので、そのURLを変更してしまうと、その評価もゼロになってしまいます。
例えば、サイト評価で重要なSNSのシェア数や被リンク数もゼロになります。
Analytics(アナリティクス)に表示されるPVなどの情報もリセットされるので、地味に嫌ですね。
ということで、もったいないのでURL(パーマリンク)を変更したらリダイレクトするようにしましょう。
パーマリンクの設定を最初にやらないといけない理由はこれです。記事をたくさん書いてから変更しないといけないというのはかなりめんどくさいです。
冒頭に書いたように「おじログ」もこの記事を書く直前にパーマリンクを変更しています。約40記事の301リダイレクトはけっこうめんどくさかったです(笑)。
作業はコピペなので、どちらかというとパーマリンクの書き方とカテゴリ分けを考える方が時間がかかってるんですけどね。
事前準備
リダイレクト処理をするには変更前のURL(パーマリンク)が必要なので、変更前に変更前のURL(パーマリンク)をメモしておきましょう。
おじさんの場合はgoogleスプレッドシートにコピペして管理しました。

ついでに新しいパーマリンクを考えたんですが、スプレッドシートで一括管理するとサイトの全体像がわかるので良い感じのパーマリンクを考えやすくなったのでオススメですよ。
さらにカテゴリも新しくしました。やはりカテゴリは少ない方が良いですね。
1対1でリダイレクトする場合
あるページのパーマリンクを新しいパーマリンクにリダイレクトしたいときがこれですね。
例えば、「https://sample.com/カテゴリー名/123」から「https://sample.com/カテゴリー名/hoge」に変更した場合です。
この場合は以下のようにすればOKです。
まずは、ロリポップ!FTPで「.htaccess」というファイルを探しましょう。一番上の階層にあるはずです。

そのファイルを開くと以下のように何行か記述されていると思います。

最上部に以下のように記述してください。
RewriteEngine On
RewriteRule ^カテゴリー名/123 https://sample.com/カテゴリー名/hoge [R=301,L]
“RewriteEngine On”の部分は省略してもOKです(理由はなぜかわかりませんが、後半に書いてあるからですかね)。

保存して完了です。
最上部に記述しないとうまくいかないこともあるようです。試しに<IfModule mod_rewire.c>内やその後ろに記述したらリダイレクトされませんでした。
ディレクトリ単位のリダイレクトの場合
例えば、「before」ディレクトリにアクセスがあった場合に「after」ディレクトリに転送させたい場合です。
RewriteEngine On
RewriteRule ^before(.*)$ /after$1 [R=301,L]
「wwwあり」から「wwwなし」へのリダイレクト
RewriteEngine on
RewriteCond %{HTTPS_HOST} ^www.example\.com
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
「wwwなし」から「wwwあり」へのリダイレクト
RewriteEngine on
RewriteCond %{ HTTP_HOST} ^www.example\.com
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
コードの意味
コピペすれば動くんですが、それぞれの部分の意味を知りたいと思ったので調べてみました。
RewriteEngine On:リダイレクト処理を記述するときに最初に書く
RewriteCond:RewriteRuleを実行するときの条件を定義するところ
RewriteRule:リダイレクト処理の内容を書くところ
^:文字列の始まりを宣言する
.*:任意の文字の連続。つまり、どんな文字列でもマッチする。
(.*):かっこで括り後方参照の$1とすることで、同じパスの違うドメインにリダイレクトできる。
R=301:リダイレクトの種類を301に指定する。
L:Lastの意味。コードの最後に記述する。
RewriteCondについて
WEB ARK LABOさんの記事によると、RewriteCondは以下のように書くみたいです。
RewriteCond %変数名(テスト文字列) 条件パターン(正規表現) [フラグ]
RewriteRule ここにRewriteRuleのURL書換&転送設定を記述
RewriteCondは複数指定できます。
フラグについて
フラグは2つの役割があります。
- RewriteCond の適用条件AND/ORを切替える
- 条件判定に大文字/小文字の区別をするか否かを切替える
1つ目の役割は、RewriteCondを複数指定した場合のAND/ORを切替えます。 フラグを記述せずにRewriteCondを複数行記述した場合はANDになります。 フラグに[OR]と記述した場合はORになります。
2つ目の役割は、その行のRewriteCondの条件比較を大文字と小文字を区別するか否かを切替えます。[NC]と記述することで大文字と小文字を区別しなくなります。 (=NCを指定しないと区別します)
ORとNCをどちらも指定したい場合には[OR,NC]とカンマで区切って指定します。
NCのCは”character(文字)”とかそういう感じの意味ですかね。Nはnotとか。NotCharacterize的な。微妙に違いそうですが。
複数の条件を指定する場合の例
RewriteCond %変数名 条件 [OR,NC]
RewriteCond %変数名 条件
RewriteRule URL書換&転送の記述
変数名
変数名はたくさんあってよくわからないので、今後勉強することにします(引用元のサイトが詳しそうですね)。
自分用のメモとして一覧表を載せておきます。
グループ | 変数名 | 値・意味 |
---|---|---|
HTTP ヘッダ | HTTP_USER_AGENT | ユーザーエージェント |
HTTP_REFERER | 参照元URL | |
HTTP_COOKIE | クッキー情報 | |
HTTP_FORWARDED | プロキシ情報 | |
HTTP_HOST | サーバーのホスト名 | |
HTTP_PROXY_CONNECTION | プロキシを経由しているか否か | |
HTTP_ACCEPT | ブラウザの言語タイプ | |
コネクション & リクエスト | REMOTE_ADDR | リモートアドレス |
REMOTE_HOST | リモートホスト名 | |
REMOTE_USER | リモートユーザー名 (基本認証利用時) | |
REMOTE_IDENT | リモートユーザーのID | |
REQUEST_METHOD | リクエストメソッド | |
SCRIPT_FILENAME | スクリプトファイル名 | |
PATH_INFO | パス情報 | |
QUERY_STRING | クエリ文字列 | |
AUTH_TYPE | 認証タイプ | |
サーバ内部変数 | DOCUMENT_ROOT | ドキュメントルートのパス |
SERVER_ADMIN | サーバー管理者情報 | |
SERVER_NAME | サーバー名 | |
SERVER_ADDR | サーバーのアドレス | |
SERVER_PORT | サーバーのポート番号 | |
SERVER_PROTOCOL | プロトコルバージョン | |
SERVER_SOFTWARE | サーバーソフトウェア | |
システム関連 | TIME_YEAR | 年 |
TIME_MON | 月 | |
TIME_DAY | 日 | |
TIME_HOUR | 時 | |
TIME_MIN | 分 | |
TIME_SEC | 秒 | |
TIME_WDAY | 曜日 (0:日 ~ 6:土) | |
TIME | 年月日時分秒 (例:20130123123456) | |
特別なもの | API_VERSION | APIバージョン |
THE_REQUEST | リクエスト文字列 | |
REQUEST_URI | リクエストURI | |
REQUEST_FILENAME | リクエストされたファイル名 | |
IS_SUBREQ | サブリクエストか否か | |
HTTPS | HTTPSでのアクセスか否か |