URLの簡略化(mod_rewrite)について

概要

mod_rewriteはApacheモジュールの一つで、アクセスURLを正規表現で書き換えることができます。mod_rewriteを利用しない状態だと、freoにアクセスするためのURLは

  • http://www.example.com/index.php/view/5
  • http://www.example.com/index.php/login

このようなURLになります。ですがmod_rewriteを利用すると

  • http://www.example.com/view/5
  • http://www.example.com/login

このようなURLでアクセスできるようになります。URLがスッキリして判りやすくなり、SEO対策にもなります。ただし、mod_rewriteが利用できるサーバーであることが必須条件です。mod_rewrite未対応のサーバーではこの機能は利用できません。

詳細

mod_rewriteに対応させる場合、freo/config.php をエディタで開き、基本設定の「mod_rewriteへの対応」を true に設定します。

さらに、以下のファイルを解凍して作成される .htaccessindex.php と同じディレクトリ内にアップロードします。(既に .htaccess を使用している場合、以下のファイルの内容を追記してください。)

.htaccess 内には、URLを書き換えるコードが書かれています。書かれている内容は以下のとおりです。

DirectoryIndex index.php

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule (.*) index.php/$1
</IfModule>

これで、freoにアクセスできるURLが変わります。

mod_rewriteを利用できるサーバーなのに正しく動作しない場合、.htaccess 内にある

RewriteRule (.*) index.php/$1

という部分を以下のように変更してみてください。

RewriteRule (.*)$ index.php?pathinfo=$1&%{QUERY_STRING}

アドレスバーに表示されるURLを統一する

例えば http://www.example.com/ にfreoを設置してmod_rewriteを設定した場合、

  • http://www.example.com/
  • http://example.com/
  • http://www.example.com/index.php
  • http://example.com/index.php

このようなURLでトップページが、

  • http://www.example.com/page/about
  • http://example.com/page/about
  • http://www.example.com/index.php/page/about
  • http://example.com/index.php/page/about

このようなURLでaboutページが表示されます。ですがmod_rewriteを使用すれば、例えばそれぞれ一番上のURLに統一することができます。(つまり、http://example.com/index.php/page/about にアクセスしても即座に http://www.example.com/page/about へリダイレクトされます。)

このような動作にする場合、.htaccess に書いた <IfModule mod_rewrite.c></IfModule> 部分を、一例ですが以下のように修正します。

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{HTTP_HOST} ^example.com
  RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L,NE]

  RewriteCond %{THE_REQUEST} ^GET\ .*/index.php
  RewriteRule ^(.*)index.php/?(.*)$ http://www.example.com/$1$2 [R=301,L,NE]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule (.*) index.php/$1 [L]
</IfModule>

3箇所ある example.com というドメインは、自分のサイトに合わせて書き換えてください。これで「www あり。index.php なし。」に統一されます。また、上の修正の代わりに

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{HTTP_HOST} ^www.example.com
  RewriteRule ^(.*)$ http://example.com/$1 [R=301,L,NE]

  RewriteCond %{THE_REQUEST} ^GET\ .*/index.php
  RewriteRule ^(.*)index.php/?(.*)$ http://example.com/$1$2 [R=301,L,NE]

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule (.*) index.php/$1 [L]
</IfModule>

とすると「www なし。index.php なし。」に統一されます。

なお、mod_rewriteでの変更内容が反映されない場合、ブラウザのキャッシュを削除して再度アクセスしてください。(ページの再読み込みだけでは、すぐに反映されない事があります。)