.htaccessによる少し複雑なリダイレクト備忘録
.htaccessのリダイレクトでハマったのでメモを残しておきます。
.htaccessでリダイレクトの除外する場合
mod_rewriteが使用可能な環境な場合
コード
RewriteEngine on RewriteBase / <IfModule mod_rewrite.c> # ディレクトリ配下でリダイレクトの指定 RewriteCond %{REQUEST_URI} !^/(target/dir/) # 拡張子で単位でリダイレクトの除外 RewriteCond %{REQUEST_URI} !\.css$ RewriteCond %{REQUEST_URI} !\.js$ RewriteCond %{REQUEST_URI} !\.jpg$ RewriteCond %{REQUEST_URI} !\.gif$ # ページ単位でリダイレクトの除外 RewriteCond %{REQUEST_URI} !^/hoge/hoge/index.html$ RewriteCond %{REQUEST_URI} !^/hoge/hoge.html$ </IfModule>
.htaccessで除外したURL以外をトップページへ飛ばす場合
コード
RewriteEngine on RewriteBase / <IfModule mod_rewrite.c> # 除外指定 ~ 省略 ~ # 除外指定したもの以外をトップページへリダイレクト RewriteRule ^(.*)$ https://paradox-tm.hateblo.jp/ [R=301,L] </IfModule>
ポイントは除外指定されたURLは、リダイレクトから除外されるのでリダイレクトの除外指定をしたものよりも下に記述すること。
個別のリダイレクト指定(除外したURLのリダイレクト指定)
コード
RewriteEngine on RewriteBase / <IfModule mod_rewrite.c> # 除外指定 & トップページへ飛ばす ~ 省略 ~ </IfModule> # 除外したけど個別にリダイレクトさせたいURLを指定 Redirect permanent /hoge/hoge/index.html https://paradox-tm.hateblo.jp/hoge/hoge/index.html Redirect permanent /hoge/hoge/index.html https://paradox-tm.hateblo.jp/hoge/hoge.html
index.htmlがある場合、すべてのページを/index.htmlに統一後にリダイレクトする場合
コード
RewriteEngine on RewriteBase / # /で終わるURLでアクセスした場合、index.htmlを付加し自分自身へリダイレクトを終了させる # 本番環境とテスト環境とでURLが違う場合も想定して、飛び先のURLは絶対パスで指定する RewriteRule ^(.*)/$ https://paradox-tm.hateblo.jp/$1/index.html [R=301,L] <IfModule mod_rewrite.c> # 除外指定 & トップページへ飛ばす ~ 省略 ~ </IfModule> # 除外したけど個別にリダイレクトさせたいURLを指定 Redirect permanent /hoge/hoge/index.html https://paradox-tm.hateblo.jp/hoge/hoge/index.html
イメージは以下の通りです。
- /で終わるURLでアクセスした場合、一度/index.htmlをつけた状態になるように自身のサイトへリダイレクト
- 除外URLに含まれるかどうかを判定
- 含まれない場合、トップページへリダイレクト
- 個別で指定がある場合、個別のページへリダイレクト
ポイントは、IfModule mod_rewrite.cの中に、index.htmlへ飛ばす記述を書かないことです。
書いてしまうとリダイレクトがうまくいかなくなります。/(スラッシュ)で統一する場合や、wwwで統一する場合も同じ。
また、本番環境とテスト環境とでURLが違う場合も想定して、飛び先のURLは絶対パスで指定することです。
【.htaccess】特定のIPだけ閲覧を許可し、その他は指定のURLにリダイレクトする
サンプルソースコード
IPアドレス例:111.222.333.444
allow from all <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|jpeg|css|js)$ [NC] # 111.222.333.444 RewriteCond %{HTTP:X-Forwarded-For} !^111\.222\.333\.444 # 111.222まで指定したい場合 RewriteCond %{HTTP:X-Forwarded-For} !^111\.222 # 指定IP以外を指定のURLにリダイレクト RewriteRule ^(.*) https://paradox-tm.hateblo.jp/ [L,R] </IfModule>
IPアドレスの確認
こちらへアクセスすると確認できます。
SSL化対応したサイトへのリダイレクト
コード
RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]