1. TOPTOP
  2. Webサービス
  3. FuelPHP

FuelPHP1.7.2のcontrollerに配置したPHPファイルが表示されない。Apacheのmod_rewriteと.htaccessを調べてみた

|

web_dev

NetBeansでFuelPHPのプロジェクトを立ち上げたので、さっそくcontrollerに、hello1.phpに設置してみました。’Hello World!’が表示される、ごく簡単なプログラムです。

<?php

class Controller_Hello1 extends Controller {
    public function action_index() {
        return 'Hello World!';
    }
}

controllerに配置したphpファイルが表示されない

NetBeansから見た場合のファイルの配置場所

fuelphp_apache1

プロジェクト名/fuel/app/classes/controller/hello1.php

ブラウザでは”Not Found”

hello1の内容を表示させるためには、ブラウザに次のURLを打ち込むことになります

ドメイン名(IPアドレス)/プロジェクト名/hello1/index

fuelphp_apache2

すると”Not Found“が…。PHPファイルの表示がされません。

fuelphp_apache3

コマンドラインから確認すると、ファイル自体はちゃんとアップロードされているんですが。

Apacheの設定 mod_rewriteと.htaccess

原因がよく分かりませんでしたので、いろいろぐぐって調べてみました。すると、Apacheの拡張モジュールであるmod_rewriteか、設定ファイルである.htaccessに原因があるのではないかと(あくまで予想ですが)。

mod_rewrite

mod_rewriteは、Google検索で空想ブログ(新しいタブで開く)さんの記事に行き着いて気がつきました。

mod_rewrite は Apache のモジュールの一つで、主に使う機能は以下2つ。
・動的URL(?id=) を 静的な URL へ正規表現で書き換える
・アクセスされた URL とは別の URL へリダイレクト

こちらの記事は、Ubuntuを前提としていると思います。自分はCentOSを使用しているので、読み替える必要があります。

その点については、Tottoko Memo(新しいタブで開く)さんの記事で、CentOSに置き換えた場合の説明がされています。ただし、自分の場合、この2つの作業ではhello1.phpは表示されませんでした…。

Apacheの公式ドキュメント(新しいタブで開く)を読むと、”RewriteBase Directive”に「何か」を記述する必要がありそうですが、その「何か」が分かりません。

.htaccess

hello1.phpが表示されないと思われる、もう一つの原因が、.htaccessです。.htaccess自体はFuelPHPのプロジェクト内部にすでに入っています。

プロジェクト名/public/.htaccess
<IfModule mod_rewrite.c>

	RewriteEngine on

	# NOTICE: If you get a 404 play with combinations of the following commented out lines
	#AllowOverride All
	#RewriteBase /wherever/fuel/is

    # Make sure directory listing is disabled
	Options +FollowSymLinks -Indexes

	# Restrict your site to only one domain
	# !important USE ONLY ONE OPTION

	# Option 1: To rewrite "www.domain.com -> domain.com" uncomment the following lines.
	#RewriteCond %{HTTPS} !=on
	#RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
	#RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

	# Option 2: To rewrite "domain.com -> www.domain.com" uncomment the following lines.
	#RewriteCond %{HTTPS} !=on
	#RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
	#RewriteCond %{HTTP_HOST} (.+)$ [NC]
	#RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

	# Remove index.php from URL
	#RewriteCond %{HTTP:X-Requested-With}	!^XMLHttpRequest$
	#RewriteCond %{THE_REQUEST}				^[^/]*/index\.php [NC]
	#RewriteRule ^index\.php(.*)$			$1 [R=301,NS,L]

    # make HTTP Basic Authentication work on php5-fcgi installs
    <IfModule mod_fcgid.c>
        RewriteCond %{HTTP:Authorization} .
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    </IfModule>

	# Send request via index.php if not a real file or directory
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d

	# deal with php5-cgi first
	<IfModule mod_fcgid.c>
        RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
        # RewriteRule ^(.*)$ /testproject/index.php?/$1 [QSA,L]
	</IfModule>

	<IfModule !mod_fcgid.c>

		# for normal Apache installations
		<IfModule mod_php5.c>
			RewriteRule ^(.*)$ index.php/$1 [L]
                        # RewriteRule ^(.*)$ /testproject/index.php/$1 [L]
		</IfModule>

		# for Apache FGCI installations
		<IfModule !mod_php5.c>
                        RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
			# RewriteRule ^(.*)$ /testproject/index.php?/$1 [QSA,L]
		</IfModule>

	</IfModule>

</IfModule>

これらの記述のうち、ErogameScape -エロゲー批評空間- Blog(新しいタブで開く)さんの記事によると、以下の「プロジェクト名」の部分を加筆すればよいとのこと。

<IfModule mod_fcgid.c>
           RewriteRule ^(.*)$ /プロジェクト名/index.php?/$1 [QSA,L]
        </IfModule>

        <IfModule !mod_fcgid.c>

                # for normal Apache installations
                <IfModule mod_php5.c>
                        RewriteRule ^(.*)$ /プロジェクト名/index.php/$1 [L]
                </IfModule>

                # for Apache FGCI installations
                <IfModule !mod_php5.c>
                        RewriteRule ^(.*)$ /プロジェクト名/index.php?/$1 [QSA,L]
                </IfModule>

        </IfModule>

ただ、自分の場合、これでもhello1.phpは表示されない。

まとめ

h2の見出しとして、「まとめ」って書いていますが、ぜんぜんまとまってなくて恐縮です。要は、mod_rewriteか.htaccessのどちらかに原因があるんだろうけど、具体的にどうすればいいのかは、分かっていないということです。

〔参考サイト〕