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/
コメント