こんにちは、ディレクターの山中です。先日、弊社採用ホームページリニューアルに伴い、ディレクトリを変更しました。旧サイトへアクセスがあった場合に、htaccessリダイレクトさせるときに少々戸惑ったので、備忘録として書き残します。
具体例1)フォルダ名だけを変更。ファイル名は変更なし。
htaccessの記述方法
RewriteEngine on
RewriteRule ^旧ディレクトリ名(.*)$ /新ディレクトリ名$1 [R=301,L]
example.com/aaa/ccc1.phpにアクセスがあったら、example.com/bbb/ccc1.php に自動で飛ぶようにしたい。example.com/aaa/ccc2.phpにアクセスがあったら、example.com/bbb/ccc2.php に自動で飛ぶようにしたい。
旧ディレクトリ
example.com
├──[aaa]
│ ├─ ccc1.php
│ ├─ ccc2.php
│ ├─ ccc3.php
新ディレクトリ
index.html
├──[bbb]
│ ├─ ccc1.php
│ ├─ ccc2.php
│ ├─ ccc3.php
RewriteEngine on
RewriteRule ^aaa(.*)$ /bbb$1 [R=301,L]
コードの詳細
(.*) ・・・ 0文字以上の任意の文字列のこと。ドットはなんらかの文字、アスタリスクは直前のドットの0回以上の繰り返しという意味です。つまりaaaフォルダに入ってるもの全部ということになる。
$1 ・・・後方参照と言い、先の括弧でマッチした文字列を参照しています。
具体例1の転送の場合は、
/aaa/ccc1.phpでアクセスした場合、/ccc.php 部分が (.*) でマッチ。$1で参照され、/bbbの後ろに連結したurl として、/bbb/ccc.phpに転送されます。
具体例2)特定のフォルダのファイルへのアクセスをすべて別のページへ転送したい
htaccessの記述方法
RewriteEngine on
RewriteRule ^旧ディレクトリ名(.*)$ /新ディレクトリ名またはURL [R=301,L]
※少々わかりにくいのですが、具体例1との違いは「$1」の有無です。
example.com/aaa/ccc1.php や、example.com/aaa/ccc2.phpにアクセスがあったら、すべてexample.com/bbb/ に自動でジャンプするようにしたい。
旧ディレクトリ
example.com
├──[aaa]
│ ├─ ccc1.php
│ ├─ ccc2.php
│ ├─ ccc3.php
新ディレクトリ
index.html
├──[bbb]
│ ├─ ddd1.php
具体例2の記述方法
RewriteEngine on
RewriteRule ^aaa(.*)$ /bbb/ [R=301,L]
あとがき
この記事を書いた直後に「これは基礎の基礎ですよ!」とエンジニアから軽く突っ込まれてしまいました(笑)
こんな基本的なことで時間をかけてしまうようになったのは情けないのですが、コードを触らない状態が続くと忘れちゃうので、やはり備忘録として残させていただくことにしました。同じパターンで困っている方の助けになれば幸いです。