気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

httpd.confにおけるリダイレクト設定

いままで、設定済みのファイルをなんとなくその場しのぎで設定してきたため、 いざってときにさっと設定できなかったので、改めてまとめてみようと思う。

実現方法

いくつか実現方法があります。メリットが大きいため、基本的には、Webサーバーでのリダイレクトを行うと思います。

htmlのmetaタグでリダイレクト

  • タグの埋め込みのみで実現できるため、簡単
  • SEO的には、Googleの評価が低くなるため、サーバー側でのリダイレクトができない場合に選択すべき

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が親の設定ファイルで、.htaccesshttpd.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の別名キーワードを書いてもいい)