いままで、設定済みのファイルをなんとなくその場しのぎで設定してきたため、 いざってときにさっと設定できなかったので、改めてまとめてみようと思う。
実現方法
いくつか実現方法があります。メリットが大きいため、基本的には、Webサーバーでのリダイレクトを行うと思います。
htmlのmetaタグでリダイレクト
JavaScriptでのリダイレクト
いくつか書き方がある。
window.location = "http://abc.com"; window.location.href = "http://abc.com"; window.location.assign("http://abc.com"); window.location.replace("http://abc.com");
- 簡単に実装できるかつ、GoogleクローラーもJavaScriptを実行できるため SEO的にも良い。
- JavaScriptの実行をOFFにしているユーザーは、転送されない。
- パラメータの引き続きを意識的に設定しないと、パラメータなしで転送してしまう。
HTTPでのリダイレクト(Apache)
こちらの方法が一番オススメ。
- SEO的に一番良い。301リダイレクトをすることでGoogleに評価を引き継いでもらえる。
- HTTPステータスコードで、301(恒久的な転送)、302(一時的な転送)など意図を伝えらえる。
- URLに対して正規表現を用いることでURLの書き換えや転送先の指定を柔軟に行える。
こちらに関しては、設定方法を以下で詳しくみていく。
HTTPリダイレクト設定方法(Apache)
.htaccess、または、httpd.confへ設定を追記することで実現する。
httpd.confが親の設定ファイルで、.htaccessはhttpd.confの設定を上書きする形で反映される。
今回は、httpd.confに記載する前提とする。
mod_rewriteが使用可能かを確認
/etc/httpd/conf/httpd.conf内の以下の行が存在し、コメントアウトされていないことを確認。
LoadModule rewrite_module modules/mod_rewrite.so
もし設定を修正した場合は以下のコマンドで、確認・反映
apachectl configtest /etc/init.d/httpd graceful
gracefulはリクエスト処理を中断しないで反映する。
httpd reload
でも反映可能。こちらは、リクエスト処理を中断して、反映する。
リダイレクト設定の書き方
同一ドメイン同一ディレクトリ内でのリダイレクト
DocumentRoot /var/www/html RewriteEngine On RewriteRule ^/main/index¥.html$ /main/index2.html [R, L] <Directory "/var/www/html"> AllowOverride All </Directory>
- RewriteEngineでURL書き換え処理をONとして、RewriteRuleでリダイレクトの設定を行う
- RewriteRule 【ドメイン以下のリダイレクト元パス(先頭/付き)の正規表現】【リダイレクト先パス】
ドメイン切り替え
・・・ RewriteEngine on RewriteCond %{HTTP_HOST} ^abc.com$ RewriteRule (.*) http:/www.abc.com/$1 [R=301, L] ・・・
- RewriteRule リダイレクト元を正規表現の()で囲むことで、遷移先のURLで 後方参照($1)として利用可能となる。
- 後方参照することで、()内のドメイン以下のリダイレクト元パスを別ドメインに切り替え可能
- RewriteRuleの前にRewriteCondで条件を設定すると、条件マッチした場合のみRewriteRuleによる リダイレクト処理が実行される
その他、よくある書き方
RewriteCond %{REQUEST_FILENAME} !-f [OR] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ /404.html [R=404,L]
- ファイルがない、またはディレクトリがない場合は、404を返却する
ErrorDocument 404 /404.html
- リクエストステータスが404のときに表示させるページを指定したい場合は、 上記のように設定する。
RewriteとRedirectの違い
RewriteとRedirectってどう違うのって最初疑問に思ったので書いておく。
Rewriteは、Rオプションをつけない場合、リクエストURLを書き換えない。 RedirectはリクエストURLを常に書き換え、元URLはわからなくなる。
Redirect
例) Redirect [status] /main/ http://www.abc.com/index.html Redirect 301 /main/ http://www.abc.com/index.html Redirect permanent /main/ http://www.abc.com/index.html
status:301(恒久的に移動の意味。permanentと301の別名キーワードを書いてもいい)