Fly higher! Sky is the limit!

webの現場で働く人のブログ

.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>

内にRewriteCondを使ってリダイレクトから除外する。 上から下へ、処理が行われるので先に優先順位を気を付けながら指定する。

.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

イメージは以下の通りです。

  1. /で終わるURLでアクセスした場合、一度/index.htmlをつけた状態になるように自身のサイトへリダイレクト
  2. 除外URLに含まれるかどうかを判定
  3. 含まれない場合、トップページへリダイレクト
  4. 個別で指定がある場合、個別のページへリダイレクト

ポイントは、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アドレスの確認

www.cman.jp

こちらへアクセスすると確認できます。

SSL化対応したサイトへのリダイレクト

コード

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]