2014年3月16日日曜日

Webサイトリニューアル時によくあるURL変更への対処法

Webサイトリニューアル等でURLが変更になった場合、(DNS切替後も)検索エンジンの結果はしばらくは
旧URLを表示する可能性が高いため、旧URLでアクセスされても新URLへRedirectする設定が必要と
なります。

Apacheのmod_rewrite機能を利用してURLの変更内容に応じてRedirect設定する方法を記載します。
正規表現の利用が可能です。

OS: RedHat EL 6.4(64-bit)
Apache: 2.2.15


1) ディレクトリ変更

旧URL → 新URL
/products → /services
    RewriteRule ^/products/(.*)\.html$ /services/$1.html [R=301,L]
(.*)は0文字以上の文字列にマッチする正規表現。$1に代入される。
例)
http://redirect-test.com/products/aaa/index.html → http://redirect-test.com/services/aaa/index.html
http://redirect-test.com/products/bbb/index.html → http://redirect-test.com/services/bbb/index.html


2) 階層変更(深くなる場合)

/info → /about/info
    RewriteRule ^/info/(.*)\.html$ /about/info/$1.html [R=301,L]
例)
http://redirect-test.com/info/index.html → http://redirect-test.com/about/info/index.html
http://redirect-test.com/info/guide.html → http://redirect-test.com/about/info/guide.html


3) ファイルパス変更(正規表現使用せず)

/info/map.html → /main/map/index.html
/info/img/map.gif → /main/map/img/map.gif
    RewriteRule ^/info/map.html$ /main/map/index.html [R=301,L]
例)
http://redirect-test.com/info/map.html → http://redirect-test.com/main/map/index.html
※RewriteRule設定は上の行から評価されるので2)の設定より先に記載する必要がある。
※画像(http://redirect-test.com/info/img/map.gif)は直接リンクされることは少ないので一般的にはリダイレクト不要。


4) 階層変更(浅くなる場合)

/main/csr → /csr
    RewriteRule ^/main/csr/(.*)$ /csr/$1 [R=301,L]
例)
http://redirect-test.com/main/csr/index.html → http://redirect-test.com/csr/index.html


5) ディレクトリ統合

/download/doc → /about/library
/download/pdf → /about/library
    RewriteRule ^/download/(doc|pdf)/(.*)$ /about/library/$2 [R=301,L]
(doc|pdf)⇒$1、(.*)⇒$2に代入される。$1を使用しない記述方法も可能。
例)
http://redirect-test.com/download/doc/catalog.doc → http://redirect-test.com/about/library/catalog.doc
http://redirect-test.com/download/pdf/catalog.pdf → http://redirect-test.com/about/library/catalog.pdf


6) 中間ディレクトリ追加

/news/201*****.html → /news/201*/201*****.html
    RewriteRule ^/news/2011([0-9][0-9][0-9][0-9])\.html$ /news/2011/2011$1.html [R=301,L]
    RewriteRule ^/news/2012([0-9]{4})\.html$ /news/2012/2012$1.html [R=301,L]
    RewriteRule ^/news/2013(\d{4})\.html$ /news/2013/2013$1.html [R=301,L]
([0-9][0-9][0-9][0-9])と([0-9]{4})と(\d{4})は同じ処理内容となる。
例)
http://redirect-test.com/news/20110912.html → http://redirect-test.com/news/2011/20110912.html
http://redirect-test.com/news/20120307.html → http://redirect-test.com/news/2012/20120307.html
http://redirect-test.com/news/20130423.html → http://redirect-test.com/news/2013/20130423.html
※年別にディレクトリでまとめる場合など


リダイレクトループに要注意!!

上記の6)の設定として安易に下記のようにRewriteRuleを設定すると、リダイレクトループが発生してしまいます。
    RewriteRule ^/news/(.*)\.html$ /news/2013/$1.html [R=301,L]

くれぐれも気をつけましょう。

■テスト用Webサイトコンテンツの確認

[root@rhel-web ~]# find /var/www/html/ -type f
/var/www/html/csr/index.html
/var/www/html/about/info/guide.html
/var/www/html/about/info/index.html
/var/www/html/about/library/catalog.doc
/var/www/html/about/library/catalog.pdf
/var/www/html/index.html
/var/www/html/main/map/img/map.gif
/var/www/html/main/map/index.html
/var/www/html/news/2012/20120830.html
/var/www/html/news/2012/20120307.html
/var/www/html/news/2012/20120715.html
/var/www/html/news/2012/20121129.html
/var/www/html/news/2013/20130423.html
/var/www/html/news/2013/20130613.html
/var/www/html/news/2011/20111026.html
/var/www/html/news/2011/20110912.html
/var/www/html/news/2011/20111127.html
/var/www/html/services/bbb/index.html
/var/www/html/services/services.html
/var/www/html/services/aaa/index.html
[root@rhel-web ~]#
※DocumentRootは/var/www/html です。

■mod_rewriteを有効にする

[root@rhel-web ~]# grep -n mod_rewrite /etc/httpd/conf/httpd.conf
190:LoadModule rewrite_module modules/mod_rewrite.so
[root@rhel-web ~]#
httpd.confの190行目あたり。上記行がコメントアウトされていないこと。(環境により行数は異なる)

■redirect.conf

httpd.confに記述してもよいが、リダイレクト設定を別ファイル(redirect.conf)にまとめる。
[root@rhel-web ~]# cat /etc/httpd/conf.d/redirect.conf
    RewriteEngine on
    RewriteRule ^/products/(.*)\.html$ /services/$1.html [R=301,L]
    RewriteRule ^/info/map.html$ /main/map/index.html [R=301,L]
    RewriteRule ^/info/(.*)\.html$ /about/info/$1.html [R=301,L]
    RewriteRule ^/main/csr/(.*)$ /csr/$1 [R=301,L]
    RewriteRule ^/download/(doc|pdf)/(.*)$ /about/library/$2 [R=301,L]
    RewriteRule ^/news/2011([0-9][0-9][0-9][0-9])\.html$ /news/2011/2011$1.html [R=301,L]
    RewriteRule ^/news/2012([0-9]{4})\.html$ /news/2012/2012$1.html [R=301,L]
    RewriteRule ^/news/2013([0-9]{4})\.html$ /news/2013/2013$1.html [R=301,L]
[root@rhel-web ~]#

★(参考)旧URLの表示はそのままでディレクトリ階層だけ変更したい場合

この場合、上述のredirect.confファイルはincludeさせない。
[root@rhel-web ~]# cat /etc/httpd/conf.d/alias.conf
    Alias /products /var/www/html/services
    Alias /info/map.html /var/www/html/main/map/index.html
    Alias /info/img/map.gif /var/www/html/main/map/img/map.gif
    Alias /info /var/www/html/about/info
    Alias /main/csr /var/www/html/csr
    Alias /download/doc /var/www/html/about/library
    Alias /download/pdf /var/www/html/about/library
    AliasMatch ^/news/2011([0-9]{4})\.html$ /var/www/html/news/2011/2011$1.html
    AliasMatch ^/news/2012([0-9]{4})\.html$ /var/www/html/news/2012/2012$1.html
    AliasMatch ^/news/2013([0-9]{4})\.html$ /var/www/html/news/2013/2013$1.html
[root@rhel-web ~]#
※redirect.confとalias.confを両方includeさせた場合は、redirect.confの設定が優先されました。


redirect.confとalias.confは別名でもかまいません。この情報がお役にたてれば幸いです。

0 件のコメント:

コメントを投稿