サイトのリニューアルが終わった後の爽快感てたまりませんよね〜?
特に長く時間がかかった問題を解決して、それをみんなと共有したくなるとか・・・。そんな気持ちでこの記事を書いている Katz です。
とあるサイトを concrete5 等リニューアルするとき、1000ページ近くあった旧サイトの URL の置換を1ページずつ行うと面倒くさいってありませんか?
そんな時は、正規表現を使い、Apache サーバーの .htaccess にルールを記入して、 mod_rewrite のリダイレクト処理を追加すると楽になります。
concrete5 の標準には、追加 URL 機能というのがあって、追加 URL には、拡張子付きのページを設定できます。
しかし、1ページ毎に設定をする必要があるので、1000ページぐらいあるサイトだど大変。
なので、 .htaccess の mod_rewrite の正規表現を使って対応することにしました。
※ このテクニックは Apache のみです。nginx では、conf ファイルを触る必要があります。
有償アドオン
また concrete5 には .htaccess のルールをより簡単に記述できる $30 の有償アドオン Redirectorを使うこともできます。 1ページずつリダイレクトルールを管理画面から入力したり、旧サイトの Google Sitemap XML を読み込んで各ページを指定する機能もついています。
※ このアドオンも .htaccess と mod_rewrite が使える Apache な Web サーバーが必要です。
前提条件
- ドメインのルートに旧サイト、新サイトとも設置する。
- mod_rewrite が使える。 (.htaccess に設定できる)
- トップディレクトリに配置 (でなかったら RewriteBase を「/」から変更) する。
リダイレクトパターン
リダイレクトの必要なパターンを下記のように設定します。
パターン |
旧サイト |
新サイト |
説明 |
#1 |
index.php は / に |
||
#1 |
index.htm は / に |
||
#1 |
index.html は / に |
||
#2 |
index[数字].html なファイルはそのままキープ。 |
||
#2 |
index.html 以外は .html 拡張子を取って / に |
||
#2 |
index.htm 以外は .htm 拡張子を取って / に |
||
#3 |
index.php 以外は .php の拡張子を取ってスラッシュを加える |
※ index[数字].html をそのままにしてリダイレクトしないという仕様は、concrete5 のエンタープライズアドオンである静的 HTML 出力で、ページリストブロックにページネーションがついた時に2ページ目以降が index2.html, index3.html というふうな URL で出力されるからです。
.htaccess サンプル
.htaccess というテキストファイルをサーバー上に作成 & 下記のコードをコピペしてください。
旧サイト、新サイトとも、ドメインのトップレベルに配置されている想定です。
ディレクトリ配下に設置されている場合は RewriteBase を変更してください。
RewriteEngine on RewriteBase / # concrete5 の設定 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME}/index.html !-f RewriteCond %{REQUEST_FILENAME}/index.php !-f RewriteRule . index.php [L] # 1 index.html, index.html, index.php をリダイレクト RewriteCond %{THE_REQUEST} ^.*/index\.(htm|html|php) [NC] RewriteRule ^(.*)index.(htm|html|php)$ /$1 [R=301,L] # 2 .html な拡張子の URL で index数字.html や index数字.htm 以外のファイルは拡張子を取ってリダイレクト RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/+([^.]+)index\d{1,10}\.(html|htm) RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.(html|htm) [NC] RewriteRule ^ /%1 [R=301,L] # 3 .php な拡張子の URL は、拡張子を取ってリダイレクト RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.php [NC] RewriteRule ^ /%1 [R=301,L]
また静的 HTML 出力を行っている場合は、動的に 404 ページの書き出しができないので、別途、.htaccess で設定する必要があります。
# エラーページ URL の設定 ErrorDocument 401 /error/401/index.html ErrorDocument 403 /error/403/index.html ErrorDocument 404 /error/404/index.html ErrorDocument 500 /error/500/index.html
concrete5 へ旧サイトからページ移行するとき
ページ移行の際、
http://www.XXX.co.jp/news/news-20150503.php
http://www.XXX.co.jp/news/news-20150503.html
というページが旧サイトで存在していたら、concrete5 は
http://www.XXX.co.jp/news/news-20150503/
な URL でページを作成し、コンテンツを移行してください。
そうすると、上記の .htaccess を使うと、html や php が拡張子のページはすべて、自動的にスラッシュなページに遷移されます。
参考リンク
- Apacheのmod_rewriteモジュールの使い方を徹底的に解説 - OXY NOTES
- .htaccess - Htaccess - replace .html with a forward slash - Stack Overflow
- htaccessで正規表現を使ったリダイレクト
- .htaccessで正規表現を使用する
- 【mod_rewrite】フラグ
- 【mod_rewrite】URLの正規化(wwwのありなし、index.htmlのありなし)
- 【mod_rewrite】正規表現
- apache :: Rewrite(mod_rewrite) - Apache HTTP Server Version 1.3
- Module mod_rewrite URL Rewriting Engine
- A Users Guide to URL Rewriting with the Apache Webserver