忘れないように記録しとこ

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

環境

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]

この設定をしておくと、第二セグメントを省略した時に403エラーを404エラーにすることができます。

 

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

 

■Config.phpの設定

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

 

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

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

$config[‘index_page’]のindex.phpを削除します。

 

$config['index_page'] = '';

こんな感じでOKです。

 

これで設定は完了です。

今日はこの辺でー

この記事が気に入ったら
いいね ! しよう

Twitter で

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください