CodeigniterでURLのindex.phpなしにする方法【403エラーも解消】

2018年5月15日

環境

Codeigniter : 3.1.8

 

はじめに

普段は、Codeigniterを使ってシステム開発をしています。

いつもサイトを作る時には、URLにindex.phpが付与されていました。

example.com/index.php/news/article

 

取った方が見栄えが良くなるけど、以前までのやり方だと運用が面倒になったり、不具合が出るため諦めていました。

 

よく紹介されているやり方(古い)

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

 

Codeigniter-2 のドキュメントに記載されていたやり方です。

上記を.htaccessに設定します。

 

この場合、新しいディレクトリを作るたびに2行目に例外設定を書き込まないといけないので、運用が面倒でした。

 

最近のやり方(不足あり)

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

Codeigniter-3のドキュメントに記載されたやり方です。

上記を.htaccessに設定します。

 

普段使うレンタルサーバーだとエラーが出ます。(共用サーバーなのが原因?

また、第二セグメントを省略した時に403エラーになってしまいます。

example.com/controller/

 

第二セグメント省略時の関数指定

通常Codeiniterは、第二セグメントを省略するとindex関数が指定されます。

つまり以下のURLが指定されます。

example.com/controller/index

 

しかし、Codeigniter-3のドキュメントの通りに設定すると、index関数が付与されません。

せめて404エラーが出てくれば気にせずいけたのですが、403エラーが出てしまいます。

 

 

管理人のやり方

以上を踏まえて、管理人の設定方法は以下になります。

 

htaccessの設定

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

 

上記を.htaccessに設定します。

大体の設定は、Codeigniter-3の公式ドキュメントに記載されたやり方と一緒です。

 

(1)ベースとなるディレクトリを明示

RewriteBase /

これを設定しないと上手く動かないレンタルサーバーがあるため設定しています。

お名前.comとかでディレクトリに設定したい時は、これが必須です。

 

ちなみに、hogeディレクトリを指定したい場合は、下記の様にします

RewriteBase /hoge/

 

もちろん削除して問題がなければ、あえて記載する必要はないです。

 

(2)レンタルサーバー対策

RewriteRule ^(.*)$ index.php [L]

公式設定の/$1を削除

これを削除すると大概のレンタルサーバーで動きます。

以下検証済みレンタルサーバー

 

(3)第二セグメント省略時の403エラー対策

RewriteRule ^(.*)/$ $1/index.html [L]

この設定をしておくと、method部を省略した時に403エラーを404エラーにすることができます。

 

これで.htaccessの設定は完了です。

 

Config.phpの設定

管理人が説明するまでも無く、数多の解説サイトがありますが・・・

 

site_url()を使用するとindex.phpが付与されてしまいます。

なので、以下の設定を行って、付与されないようにします。

 

application/config/config.phpに以下の記述を変更します。

$config['index_page'] = 'index.php';

$config['index_page']index.phpを削除します。

$config['index_page'] = '';

こんな感じでOKです。

 

これで設定は完了です。

今日はこの辺でー

 

  • この記事を書いた人

カバノキ

印刷会社のWEB部隊に所属してます。 WEB制作に携わってから、もう時期10年になります。 普段の業務では、PHPをメインにサーバーサイドの言語を扱っています。 最近のお気に入りはJavascriptです。 Vue.jsを狂喜乱舞しながら、社内に布教中です。

-CodeIgniter
-, , , , , , , ,