こんにちは。菜笑[なえ] (@nae310_)です。
今回は.htaccess
についての備忘録です。
リダイレクト設定などプラグインを使う方も多いと思いますが、.htaccess
の編集方法がわかればプラグイン1つ不要になるので、ぜひ使えるようにしましょう。
ただ.htaccess
の編集は間違えるとページが表示されなくなったりという可能性もあリます。
なので、
・ .htaccess
ってなに?
・そんなファイルどこにあるの?
という方はプラグイン使っておいた方が安全です。
完成コード
今回は例としてexample.com
というドメインを例に使用しています。
それぞれどのように編集すればいいか、何が書いてあるかの解説はこのあと書いています。
# BEGIN redirect
<IfModule mod_rewrite.c>
RewriteEngine On
# httpsに転送
RewriteCond %{HTTPS} off
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]
</IfModule>
# END redirect
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
# redirect each page
redirect 301 旧URLパス 新URL
redirect 301 旧URLパス 新URL
各記述の編集方法
WordPress初期設定
# BEGIN WordPress
〜# END WordPress
の部分です。
WordPressの初期設定で記述されているものなので、基本的にそのままで大丈夫です。
URLの正規化
# BEGIN redirect
〜# END redirect
の部分です。
ここはURLを正規化するための設定を記述しています。
URLの正規化というのは、同じページなのに違うURLで表示されてしまうことが内容に、統一した表記にすることです。
今回はhttp://~
へアクセスがあった場合にhttps://~
へリダイレクトする設定と、wwwの有無を統一させる設定を書いています。
以下のどの条件に当てはまるかを確認して、上記コードから該当する箇所を削除してください。
- httpsを使用しない場合
# httpsに転送
の部分を削除
- wwwなしのURLを使う場合
# wwwありに(どちらか一方)
の部分を削除
- wwwありのURLを使う場合
# wwwなしに(どちらか一方)
の部分を削除
そして以下にも注意して記述を修正していきましょう。
example.com
を自身のドメインに変更するexample\.com
となっている部分の\
は削除しない# BEGIN WordPress
〜# END WordPress
よりも前に書く
各ページのリダイレクト[簡単!]
# redirect each page
ここは各ページのリダイレクトが必要な場合に使用します。
例えば、https://example.com/old-page
というページをhttps://example.com/new-page
というページにリダイレクトする場合は以下のような記述になります。
redirect 301 旧URLパス 新URL
↓
redirect 301 /old-page https://example.com/new-page
注意点としては、リダイレクト元の古いページはURLではなくパスを記述するということです。
パスというのはURLからドメイン部分https://example.com
を削除した場所になります。
この書き方でリダイレクトしたいページをいくつも設定することができます。
WordPressのパーマリンクを変えた場合などには、既存のページのリダイレクト設定を全て書けばOKです。
ただ、全投稿のURLを書くのは結構大変ですよね。
自分も手動でやるのは嫌だと思い、一括で全投稿ページのURL&リダイレクト設定の記述が取得できるサービスを作ったので、よければ使ってみてください。
※ 開くまでに時間がかかる場合があります。
mod_rewriteの解説
では、次に# BEGIN WordPress
や# BEGIN redirect
に書いてある内容について、もう少し詳しく解説しています。
知らなくても上記設定をすれば問題なく動くので、気になる方だけご覧ください。
IfModule
<IfModule mod_rewrite.c> … </IfModul>
はmod_rewrite
というモジュールが使えるかどうかを確認しています。
mod_rewrite
モジュールが使用できる場合は、<IfModule mod_rewrite.c> … </IfModul>
の中の記述を実行します。
mod_rewrite.c
というのはmod_rewrite
モジュールのファイル名です。
もし確実にmod_rewrite
モジュールが使えることがわかっていれば記述は不要です。
ですがエラーとなっても困るので基本的に<IfModule mod_rewrite.c> … </IfModul>
の中にこれから説明する記述を書いていく。という認識で大丈夫です。
RewriteEngine
RewriteEngine
はmod_rewrite
のon, offを設定するものです。
<IfModule mod_rewrite.c>
のあとすぐ処理の先頭に、RewriteEngine On
とonにして書いておけば大丈夫です。
RewriteCond
RewriteCond
はその後のRewriteRule
を実行するための条件を指定します。
この条件にマッチした場合は、後述するRewriteRule
に従ってリダイレクトが実行されます。
条件の指定の仕方は以下の通りです。
RewriteCond %{環境変数} 条件
- 環境変数の例
HTTPS
: httpsアクセスならON、それ以外はOFFHTTP_HOST
: ホスト名(www.example.com
など)REQUEST_URI
: リクエストされたURI(/index.html
など)REQUEST_FILENAME
: リクエストされたファイル名。ファイルがなければREQUEST_URI
と同じ値。
- 条件の例
- 正規表現: ホスト名の場合、
^www.example\.com
など -f
: 存在するファイルであればtrue(!-f
は真偽値が反対になる)-d
: 存在するディレクトリであればtrue(!-d
は真偽値が反対になる)
- 正規表現: ホスト名の場合、
RewriteRule
RewriteRule
はリダイレクトのルールを書いていきます。
書いてある内容は以下の通りです。
RewriteRule 置換条件 置換語の文字 [オプション]
- 置換条件
- どんなURLをリダイレクトさせるか?という条件
- 正規表現が使える
- 置換語の文字
- リダイレクト先のURL
$1
は正規表現の()
内の条件にマッチした文字が入る
- オプション
- 301リダイレクトの場合
[R=301]
が必須 [R=301]
省略すると302リダイレクトとなる[L]
があればそこで処理が終了し、その後の処理は実行されない[R=301,L]
はセットで書くと思ってOK
- 301リダイレクトの場合
RewriteBase
RewriteBase
はリダイレクト先URLの基準のディレクトリを指定できます。
ただこれはRewriteRule
で指定したリダイレクト先のURLが相対パスで示されている場合のみ有効となるので、絶対パスで指定する場合は不要となります。
RewriteBase /
と指定した場合は、ルートディレクトリ(.htaccessが配置されているディレクトリ)が基準となります。
おわりに
かなり長くなりましたが.htaccessについて少しは理解を深めていただけたでしょうか。
mod_rewriteを自分で書こうと思うと大変だと思うので、基本的にリダイレクトしたいページがあれば、「各ページのリダイレクト」の部分で解説した方法で書けばOKです。
redirect 301 旧URLパス 新URL
ですね。
WordPressでパーマリンクの変更方法を探していた方は、ぜひこちらもご利用ください。
一発で全投稿ページのリダイレクト設定の記述が取得できるので。