さくらインターネットのレンタルサーバのPHPはCGI版で、CodeIgniterを使用するにはちょっとした工夫が必要になります。

CodeIgniterをさくらインターネットで使う方法は、3通りあります。

  1. QUERY_STRINGを使う方法
  2. PATH_INFOを使う方法
  3. ORIG_PATH_INFOを使う方法

PATH_INFO、ORIG_PATH_INFOを使う方法については他のサイトで結構たくさん解説されているので、ここでは省略します。

PATH_INFO、ORIG_PATH_INFOを素直に使うのが最も簡単な方法かと思いますが、テスト環境(ローカル、XAMPPなど)で同じ状況を作ることが難しいなどのデメリットもあります。

もしテスト環境と本番環境(さくらインターネット)とでプログラムを変更したくない場合は、これから解説するQUERY_STRINGを使う方法をオススメします。

では、QUERY_STRINGを用いてCodeIgniterを動かす方法を解説します。

1. php.iniの編集

編集しなくてOKです。

2. .htaccessの編集

RewriteEngine On
RewriteBase /
RewriteCond $1 !^(index\.php)
RewriteRule ^(.+)$ /index.php?/$1 [L]

※重要なのは黄色い行です。他の行に関しては必要に応じて変更を加えて構いません。

※RewriteBaseの設定は実際のディレクトリ構成に沿って決めてください。設定によってはトップページしか表示されないような状況にもなりますので、いろんなページを開いて確認してみてください。ちなみに、ここを間違えると500エラーが発生します。

3. application/config/config.phpの編集

$config['uri_protocol'] を QUERY_STRING に変更してください。

以上が基本となります。

ここで1つ注意点があります。

QUERY_STRINGを使用する場合、GETパラメータが使用できなくなります。

CodeIgniterではセキュリティの関係でGETパラメータを使用しないことが推奨されておりますが、HTMLのformタグなどを使った場合など、どうしてもGETパラメータが必要になることもあるでしょう。

GETパラメータを使いたい場合のために、次の2つの対策をご紹介しておきます。

1. POSTとリダイレクトで代用する方法

class Redirect extends MY_Controller {
    
    function Redirect()
    {
        parent::__construct();
    }
   
    function search()
    {
        if( isset($_POST['q']) )
        {
          redirect( 'search/index/' . urlencode($_POST['q']) );
        }
        else
        {
          show_error('invalid post.');
        }
    }
}

詳しい説明は不要かと思うので省略します。

この方法はCodeIgniterのルールに沿っているという点がメリットと思いますが、POSTできる文字に制限があるのがデメリットでしょう。特に半角スラッシュ「/」を送信するとredirect関数からエラーが生じますので、Redirect::search()内で半角スラッシュを除去したり、別の文字に置き換えたりなどの工夫が必要になります。

2. GETパラメータを自分でセットする方法

$_GET = parse_url($_SERVER['REQUEST_URI']);
$_GET = urldecode($_GET['query']);
parse_str($_GET,$_GET);

index.phpの先頭で上記のように記述しておけば、$_GETパラメータの使用が可能となります。本当に無理矢理ですが。

PR