【.htaccess】いろいろな301リダイレクト

  • URLをコピーしました!
目次

RedirectMatch permanent

/test/で終わるURLのとき /test2/に

RedirectMatch permanent /test/$ /test2/

$ : 直前の文字が最後にある

https://example.com/test/ → https://example.com/test2/
https://example.com/hoge/test/ → https://example.com/test2/

[ドメイン]/test/のとき/test2/に

RedirectMatch permanent ^/test/$ /test2/

^ : 直後の文字が行の 先頭 にある
$ : 直前の文字が 最後 にある

https://example.com/test/ → https://example.com/test2/

[ドメイン]/test/のなかのファイルをすべて/test2/に

RedirectMatch permanent ^/test/+ /test2/

+ : 直前の文字が1回以上繰り返す

https://example.com/test/ → https://example.com/test2/
https://example.com/test/test.html → https://example.com/test2/

RedirectMatch permanent ^/test/* /test2/

* : 直前の文字が0回以上繰り返す

↓ / が0でもよくなるので、これもマッチするようになる
https://example.com/testing/ → https://example.com/test2/

[ドメイン]/test/index.htmlなど/test/***をすべて/test2/***に

RedirectMatch permanent ^/test/(.*) /test2/$1

(.*) と $1 : () の中の正規表現(任意の一文字を0回以上繰り返す)にあてはまった文字が、$1に入る

https://example.com/test/ → https://example.com/test2/
https://example.com/test/test.html → https://example.com/test2/test.html

[ドメイン]/test/index.htmlなど/test/のなかのファイルを、/test/hoge/以外すべて/test2/に

RedirectMatch permanent ^/test/((?!hoge/+).*)$ /test2/

/test/で始まって hoge/ + 任意の文字列 は含まない という意味になる

https://example.com/test/ → https://example.com/test2/
https://example.com/test/fuga/index.html → https://example.com/test2/
これは移動しない https://example.com/test/hoge/index.html

参考:正規表現:文字列を「含まない」否定の表現まとめ

^/test/((?!hoge).*) でもいいが、これだと/test/hoge2/も除外される

RedirectMatch permanent ^/test/((?!hoge/+).*)$ /test2/$1

https://example.com/test/ → https://example.com/test2/
https://example.com/test/fuga/index.html → https://example.com/test2/fuga/index.html
これは移動しない https://example.com/test/hoge/index.html

※ 複数除外したいときは ((?!hoge/+|fuga/+).*) のよう | で繋ぐ。

【日本語】 [ドメイン]/テスト/ を /test2/ に

RedirectMatch permanent ^/テスト/$ /test2/

https://example.com/テスト/ → https://example.com/test2/

※ UTF-8(BOMなし)にすること
※ さくらサーバーにて動作確認
Xserverで、この表記で問題ないとの検証記事がありますが、サーバーによってはURLエンコードやさらにそのエスケープ処理が必要なこともあるようです。

URLに半角スペースが入っている場合 (500エラーが出たら)

元URLに半角スペースが入っている場合そのままだと.htaccessの書き方として問題があるため500エラーが出ます。
"^/テスト テスト/$" こんな感じでダブルクォーテーションで挟んであげればOKです。

RedirectMatch permanent "^/テスト テスト/$" /test2/

URLに()が入っている場合

元URLに()が使われている場合はそのままだと正しく動作しません。
^/test\(1\)/$ こんな感じで()を\でエスケープしてあげればOKです。

RedirectMatch permanent ^/test\(1\)/$ /test2/

RewriteRule(mod_rewrite)

<ifModule mod_rewrite.c>
RewriteEngine On
# ここにリダイレクトの指定を書く

</ifModule>

[.htaccessのあるディレクトリ]/test/のとき、/test2/にリダイレクト

RewriteRule ^test/$ "/test2/" [R=301,L,NE]

R=301 : 301リダイレクト
L : この条件にマッチしたURLは、以降のルールではリライトしない
NE : No Escape(今回はこれは無くてもいい)

参考:RewriteRuleのフラグと、RewriteCondの変数一覧

【日本語】 [.htaccessのあるディレクトリ]/テスト/ を /test2/ に

RewriteRule ^テスト/$ "/test2/" [R=301,L,NE]

https://example.com/テスト/ → https://example.com/test2/

※ UTF-8(BOMなし)にすること
※ さくらサーバーにて動作確認
※ サーバーによってはURLエンコードやさらにそのエスケープ処理が必要なこともあるようです。

【日本語クエリ】 [.htaccessのあるディレクトリ]/test/?tag=テスト を /test2/ に

RewriteCond %{QUERY_STRING} ^tag=%E3%83%86%E3%82%B9%E3%83%88
RewriteRule ^test/$ "/test2/?" [R=301,L,NE]

“/test2/?”の ?があると、リダイレクト先ではクエリの文字列は削除される

https://example.com/test/?tag=テスト → https://example.com/test2/

※URLエンコードのみでは動作しない場合は以下の解決案もあり。

【クエリ】クエリ文字列の一部分はリダイレクト先のURLに入れたい

RewriteCond %{QUERY_STRING} ^tag=%E3%83%86%E3%82%B9%E3%83%88&category=(.*)
RewriteRule ^test/$ "/test2/?cate=%1" [L,R=301,NE]

(.*) の部分にマッチした文字が、%1 に入る

https://example.com/test/?tag=テスト&category=82 → https://example.com/test2/?cate=82

/index.html または /index.php から /へリダイレクト

RedirectMatchを使うとリダイレクトループが発生するので、RewriteCondを併用する必要がある。

RewriteCond %{THE_REQUEST} ^.*/index.(html|php)
RewriteRule ^(.*)index.(html|php)$ /$1 [R=301,L]

https://example.com/index.html → https://example.com/
https://example.com/test/index.html → https://example.com/test/

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

CAPTCHA

目次