こんにちは。菜笑[なえ] (@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でパーマリンクの変更方法を探していた方は、ぜひこちらもご利用ください。
一発で全投稿ページのリダイレクト設定の記述が取得できるので。
