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

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]

この設定をしておくと、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です。

 

これで設定は完了です。

今日はこの辺でー

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

Twitter で
Comments (2)
  1. pogu より:

    初めてCodeigniterを設定している者です。
    普通の書き方をしてもレンタルサーバーのせいで、.htaccessが機能してなかったことが、この記事をみてわかりました。検索結果上位からずっと見て来ましたが、この記事ではじめて書いてありました。大変助かりました。(^(.*)/$ $1/index.html [L]は貴サイト独自の設定でしょうか?どういう使い方を想定しているのか当方は気が付けませんでした)ありがとうございます。

    1. 管理人 より:

      初めてCodeigniterでお役に立ててよかったです。

      (^(.*)/$ $1/index.html [L]は、URLがスラッシュ終わりの時に、403エラーになってしまうのを防ぐために設定してます。
      通常、URLがスラッシュ終わりの時には、index(index.htmlやindex.php等)が参照され、ファイルが存在していなければ404エラーになるのですが、htaccessでindex.phpの省略を行ってしまうと403エラーになってしまいます。
      なので、上記の記述でスラッシュ終わりの時は、index.htmlを参照するようにしてあげると、ファイルが存在しない時に404エラーを返すようになります。

コメントを残す

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

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