CodeIgniter のルーティングからindex.phpを削除する。

CodeIgniterがデフォルトの状態でのルーティング処理は、以下のようなURIになります。

http://example.com/index.php/[コントローラ]/[アクション]/[パラメータ1]/[パラメータ2]/

ドメインの後に/index.php/という文字列が入ってしまい、URIが長くなる上SEO的にも望ましくありません。

そこで、ここでは以下のような形の/index.php/が入っていないURIを目指します。

http://example.com/[コントローラ]/[アクション]/[パラメータ1]/[パラメータ2]/
スポンサーリンク

デフォルトルーティングの挙動

CodeIgniterのようなフレームワークでは、コントローラ・アクションに対応したURLを決定する機能を備えています。この機能を「ルーティング」や「URI(URL)ルーティング」と呼びます。

CodeIgniterでは、以下のようなルーティング処理が行われています。

http://example.com/index.php/[コントローラ]/[アクション]/[パラメータ1]/[パラメータ2]/

つまり、「Hello」コントローラの「World」アクションにアクセスしたい場合は、以下のようなURLになります。

http://example.com/index.php/hello/world/

このルーティング処理を、以下のような形にするのが今回の目的です。

http://example.com/hello/world/

デフォルトルーティングの問題

Codeigniterのデフォルトルーティングのままだと、以下のようなURLにアクセスした際にWebサーバのエラー画面が出ます。

http://example.com/hello/
Example Domain
Example Domain

ここはWebサーバのエラー画面ではなく、CodeIgniterエラー画面を出したいところです。

また、一般的にURLが長くなるとSEO的にも不利とされているため、そういった観点からも短いURLを目指すに越したことはありません。

CodeIgniterのルーティングから/index.php/を取り除く設定は、以下の2ステップのみです。

.htaccess の追加

CodeIgniterのフロントコントローラ(index.php)と同じ階層に.htaccess を追加します。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

上記の記載により「存在しないファイル、ディレクトリにアクセスした場合は全てindex.phpで処理する」というリダイレクトが設定されています。

また、index.phpをリダイレクト対象から除外することによって、index.phpにアクセスした際に無限リダイレクトが発生するのを防いでいます。

この設定により、CodeIgniterのURIから/index.php/が削除され、http://example.com/hello/world/というアクセスができるはずです。

application/config/config.php の編集

上記mod_writeの設定によりURLからはindex.phpが削除されましたが、もう一つ問題があります。

CodeIgniterにはフォームヘルパーやURLヘルパーなどのようなヘルパー関数が充実しており、

$this->load->helper('form');
echo form_open('email/send');

と書くだけで

<form method="post" accept-charset="utf-8" action="http://example.com/index.php/email/send">

というタグを生成してくれます。

URLヘルパーの方はこう。

$this->load->helper('url');
echo site_url('controller/action/param');

↓

Example Domain

こういったヘルパー関数からindex.phpを削除するためには設定ファイルの編集が必要になります。

CodeIgniterの設定ファイルはapplication/configディレクトリで制御されており、今回の設定はその中のconfig.phpに行います。

application/config/config.phpを開き、index_pageという項目を以下のように編集します。CodeIgniterの3.1.6では28行目に記載されていました。

/*
|--------------------------------------------------------------------------
| Index File
|--------------------------------------------------------------------------
|
| Typically this will be your index.php file, unless you've renamed it to
| something else. If you are using mod_rewrite to remove the page set this
| variable so that it is blank.
|
*/
$config['index_page'] = 'index.php';

↓

$config['index_page'] = ''; // 空白に変更

上記設定により、ヘルパー関数のURLからもindex.phpが削除されます。

$this->load->helper('form');
echo form_open('email/send');
↓
<form method="post" accept-charset="utf-8" action="http://example.com/email/send">

$this->load->helper('url');
echo site_url('controller/action/param');

↓

404 - Not Found

 

コメント

タイトルとURLをコピーしました