とある金融系企業サーバーのステージング環境へ、あるシステムを納品し、動作確認しようとしたときのことです。
この企業へは今までにいくつものシステムを納入した実績がありましたが、PHPのワークフレームにCodeIgniterを使用したものは初めてでした。
さて、ファイルアップも終わり、いざ最初のページを開こうとしたら、
Not Found
まあ、実際は、その企業サイトの404ページが表示されたのですが。
CodeIgniterを使用したことがある方ならご存じのとおり、たとえば、
https://www.example.jp/top/index
というURLのWebページの場合、本当は以下のURLとなります。
https://www.example.jp/index.php/top/index
これを.htaccessやCodeIgniterの設定で、index.phpを表示させないようにしています。
.htaccessの書き方が間違っている、またはこれが効いていない可能性を考えて、 https://www.hoge.jp/fuwa/index.php/top/index
のように入力してみると、リクエストを受け付けられませんというエラー。後でログをサーバー運営会社から取り寄せて調べたら、401エラーでした。
まず疑ったのは、.htaccess。
無条件にGoogleへリダイレクトするように書き換えたら、これは正常に動きました。つまり、.htaccssは認識されているし、Rewriteも可能ということになります。
では、CodeIgniterのindex.phpへのリダイレクトが間違っている?
それだと、https://***/index.php/top/index
のようにアクセスしたときにもエラーになる理由になりません。
だったら、CodeIgniterの設定が間違っている?
何度見ても、サイトのURLの設定は間違っていません。
それなら、環境が違う?
index.phpの中で ENVIRONMENT という定数を定義しています。通常、ローカルで実行するときは localhost
、開発環境では development
に設定します。
このENVIRONMENTによって、読み込む設定ファイルが自動的に切り替わります。
ENVIRONMENTに設定する環境は、.htaccessでSetEnvしておくことで、その環境と認識させられます。
今回は.htaccessで環境を指定せず、すでに運用している別のシステムの環境設定ファイルを読み込んで、新規システムの環境を設定するようにしていました。既存の環境設定ファイルをうまく読み込めていないのかもと思いましたが、調べた結果、これが原因ではないようでした。
「この企業のサーバーは、いつもこうだ!」と憤ってみても、システムは動いてくれません。
気を取り直して、index.phpにecho文を仕込み、そこでexitするようにしてみました。そもそもindex.phpが動いているのかを見るためです。
それで、https://www.hoge.jp/fuwa/index.php
を実行。「リクエストを受け付けられません」・・・
index.phpが動いていない。
きっとこれはサーバーのせい、いや、WAFのせいと考えるしかない。
そう言ったところで、サーバーやWAFの設定を変えてくれることはありません。
落ち着いて考えると、この日、同時に納入した別のシステムはちゃんと動いています。
何が違うのか。
動いているシステムはCodeIgniterを使用していない。だから、トップページは https://www.hoge.jp/mofu/input.php
みたいなURL。
「だったら、index.php という名前が使用できないのでは?」と思い、試してみることに。
単なるecho文だけを記述したファイルをいくつか用意し、試してみることに。
index.php
test.php
app.php
どれも実行できました。
とすると、やはり.htaccessが怪しい気がする。
解決
念のため、CodeIgniterのindex.phpをapp.phpという名前に変更。
設定のインデックスページのファイル指定も、app.php に変更。
これでURLは https://www.hoge.jp/fuwa/app.php/top/index
のようになるけれど、システムを動かすためだから仕方ないよね。
.htaccessは通常、以下のように書くと思います。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
これを以下のように変更。
RewriteEngine On
RewriteCond %{REQUEST_URI} /fuwa/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /fuwa/app.php [L]
app.php/$1 の /$1 は外しても動くそうで、これがあると動かないサーバーもあとのことなので外してみました。
https://www.hoge.jp/fuwa/app.php/top/index
動いた!
やっと動くようになりました。
結局、原因は分からずじまいでしたが。