質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
mod_rewrite

ApacheウェブサーバーのためのURL書き換えモジュールです。主にプリティーURLに使われていますが、同様に単純置換を超えた、多様なタスクの処理能力や柔軟性があります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

6199閲覧

phpフレームワークのフロントコントローラについて

pato

総合スコア32

mod_rewrite

ApacheウェブサーバーのためのURL書き換えモジュールです。主にプリティーURLに使われていますが、同様に単純置換を超えた、多様なタスクの処理能力や柔軟性があります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2015/10/13 06:22

xamppをインストールして「パーフェクトphp」という本を読み進めながらphpの勉強をしています。今やっているところは「簡単なフレームワークを作ってphpフレームワークの仕組みを学ぼう」というところなのですが、フレームワークのフロントコントローラの部分ができません。(OSはWindows10)

ドキュメントルート→C:\xampp\htdocs\miniblog.localhost\web
mini-blog.localhostディレクトリにcontrollersディレクトリ・coreディレクトリ・modelsディレクトリなどこのアプリケーションに関するすべてのファイル・ディレクトリを置いている。
webディレクトリ内に.htaccessファイルを置く。.htaccessファイルの中身は以下(本に書いてある通り)。

<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>

次にwebディレクトリ内にindex.phpを作成。
次にC:\xampp\apache\conf\extraa\httpd-vhosts.confファイルを開き一番下に以下のコードを追加。

NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/mini-blog.localhost/web" ServerName mini-blog.localhost DirectoryIndex index.php index.html <Directory "C:/xampp/htdocs/mini-blog.localhost/web"> AllowOverride All Allow from All </Directory> </VirtualHost>

次にC:\Windows\System32\drivers\etc\hostsファイルを開き一番下に次の行を追加。

127.0.0.1 mini-blog.localhost

これで、指定されたファイルが存在する場合はそのファイルを読み込み、存在しなければどんなURLであろうとすべてindex.phpにアクセスする、と説明されています。
上記設定以外のこのアプリケーションに必要なファイルはダウンロードサービスで取得できるのでそれを使い実際試した結果、
http://mini-blog.localhost/でアクセスした場合、正常に表示される。
http://mini-blog.localhost/index.phpでアクセスした場合、正常に表示される。
http://mini-blog.localhost/aaa.phpでアクセスした場合、「Web ページが見つかりません(HTTP 404) 」のエラー表示。
となります(aaa.phpというファイルは存在しない)。
そもそもどうなったら正常なのかがよくわからないのですが、これって本に書いてある意図通り動いているのでしょうか?説明を読むと、aaa.phpなど存在しないファイル・ディレクトリ名でアクセスされた場合index.phpにアクセスするように読めるのですが、そういうことではないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

私も現在同じ本で学習しており、その辺が悩みどころでした。

質問の意図である

これって本に書いてある意図通り動いているのでしょうか?説明を読むと、aaa.phpなど存在しないファイル・ディレクトリ名でアクセスされた場合index.phpにアクセスするように読めるのですが、そういうことではないのでしょうか?

これはその通りです。そして存在しないファイルディレクトリ /aaa.php 等 をURLに叩くと
Application.php の runメソッド内の

PHP

1HttpNotFoundException('No! route found for' . $this->request->getPathInfo());

にある文字列'No! route found for'と、指定したpathが表示されます。
で、このフレームワークはまず httpd-vhosts.conf ファイルでドキュメントルートを /web にしているので、 mini-blog.localhost とURLを入れると、 /web の中にある index.php か index.html を見に行きます。さらにそのフォルダ内に .htaccess があり、ここではどんなURLでアクセスがあってもまず index.php を読み込みに行きなさい。という指定がしてありますので、
URLの頭に mini-blog.localhost と叩くとその後ろに何が書いてあっても。 /web フォルダ中の index.php をまず真っ先に見に行く様になっています。

そして、ここを読み込むことで連鎖的に core フォルダや models controller view とファイルを辿って、状況に応じた処理が行われるという事です。
MiniblogApplicationに配列を入れてあるのがその大本の指示ですね。

そして、想定外のURLが来た場合は先程説明した Application.php の runメソッド内の

PHP

1HttpNotFoundException('No! route found for' . $this->request->getPathInfo());

が動く、という事ですね。

正直この本はいきなり7章でフレームワークを作らせるのはかなり無茶らしいです。
8章でフレームワークの使い方を学んでから、7章のフレームワークの動きを把握するのが
良い様です。
以上、ご参考になれば。

投稿2015/11/05 11:33

sakamata

総合スコア203

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pato

2015/11/07 05:51

解答ありがとうございました。 phpを理解できていたら頂いた説明のように理解できるのでしょうが、もう少し説明がほしいところですよね。 たしかに8章からやったほうかいいかもしれないです。ありがとうございました。
guest

0

rewriteモジュールが使えない環境、というのとはちょっと違いますが、.htaccessの内容が有効にならないパターンはあります。
.htaccessファイルでのアクセス制御を有効にするか無効にするかという設定がhttpd.conf内にあります。
もし、httpd.conf内に
AllowOverride None
という表記があった場合、
AllowOverride All
に編集すると解決する可能性があります。
参考:http://itpro.nikkeibp.co.jp/article/COLUMN/20080512/301299/

投稿2015/10/15 15:42

TakuyaMitamura

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※notable様の回答にコメントさせていただいた内容と同じです。
内容的に回答欄に記載したほうがふさわしいかと思い直したため、こちらにも記載させていただきます。

"<IfModule mod_rewrite.c>"と"</IfModule>"の2行を削除して、Apacheを再起動してみてください。

もしmod_rewriteモジュールが有効になっていなければ、起動できなくなるか、何かしらのエラーが表示されるはずです。
http://httpd.apache.org/docs/2.2/mod/core.html#ifmodule

mod_rewriteモジュールが無効になっていて、Apacheのバージョンが2.1以上の場合、"<IfModule mod_rewrite.c>"を"<IfModule rewrite_module>"に変更してみてください。
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

mod_rewriteモジュールが有効だった場合(正常にApacheが起動してしまった場合)、以下のリンクが参考になるかもしれません。
http://d.hatena.ne.jp/pcmaster/20090207/p3
http://d.hatena.ne.jp/pcmaster/20090607/p1

投稿2015/10/14 18:15

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

mod_rewriteが設定(.htaccessに書いたもの)通り動作している場合、
aaa.phpにアクセスするとindex.phpにアクセスしたかのように動作するはずなので、
mod_rewriteが動作していない可能性があります。

XAMPPのhttpd.conf(C:\xampp\apache\conf\httpd.confあたりにあると思うのですが。)をエディタで開き、
LoadModule rewrite_module modules/mod_rewrite.so
の記述の前に#が入っていたら削除してApacheを再起動してみてください。

もしhttpd.conf内に↑の記述が見つからない場合は
httpd.conf内をmod_rewriteで検索してみてください。

投稿2015/10/13 07:00

notable

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pato

2015/10/13 11:04

解答ありがとうございました。 LoadModule rewrite_module modules/mod_rewrite.so はコメントはされていませんでした。やはり動作がおかしいですよね。 .htaccessファイルは自分で作成することはできなかった(頭が.(ドット)から始まるファイル名はつけられない)ので、ダウンロードサービスでダウンロードしたファイルを使っているのですが、これだとダメですかね?一応ファイル名は「.htaccess」ですが。
notable

2015/10/14 02:04

そうでしたか…。 最終的にファイル名が.htaccessであれば動作すると思います。 .htaccessが動作しているか、問題の切り分けのために確認したいのですが、 試しに、.htaccessに構文エラーを発生させてみると .htaccessが有効になっているか確認できそうです。 .htaccessの一番上に「あ」など何でも良いので 日本語を入れてからブラウザでアクセスしてみてください。 Internal Server Errorが表示されなければ.htaccessが 有効になっていないということになります。 あと一つ、今さらですが、本文中にはドキュメントルートが C:\xampp\htdocs\miniblog.localhost\web と書いてあり、 設定ファイル中には C:/xampp/htdocs/mini-blog.localhost/web と書いてある(ハイフンの有無が異なる)のですが、実際は正しい記述になっていますか? ブラウザでindex.phpにアクセス出来ているので正しくなっているとは思うのですが念のため確認です。
pato

2015/10/14 14:46

解答ありがとうございます。 私も.htaccessが有効なのかどうかはっきりしないのでそれを調べる方法をネットで質問しようと思っていたので本当にありがとうございます。たしかにそれで有効かどうかわかりますよね。 試してみた結果日本語を入れたら Server error! サーバ内部で障害が発生し、 リクエストに応えることができませんでした。 サーバが過負荷であるか、 CGI スクリプトにエラーがあります。 サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。 Error 500 となり、もとに戻したら正常に画面が表示されたので.htaccessファイルは有効のようです。 次に2つめのご指摘については質問文の中のドキュメントルートのパスをmini-blogと書くべきところをminiblogと間違えておりました。すみませんでした。実際のディレクトリ名はmini-blog.localhostです。 今日cakephpの本を読んでて気になったのですが、その本に「rewriteモジュールを使えない環境の場合は・・・」と書いてあったのですが、私の使っている環境が「rewriteモジュールを使えない環境」である可能性はありますでしょうか?ありますでしょうか、と聞かれてもあれでしょうけど(笑)本には「rewriteモジュールを使えない環境」というのが具体的にどういう状況なのかは書かれていませんでした。その本には「xamppをインストールした時点ではrewriteモジュールは使えない」ということも書いてありました。「使えない環境」というのがhttpd.confファイルのrewriteモジュールの部分がコメントしてあるから使えない、ということなら、コメントは外したのでそれで解決だと思うのですが、それ以外の私の知らない要因でrewriteモジュールが使えない状況だとすると、その要因について調べてrewriteモジュールを使えるようにする必要がありますよね?実際そうなのかどうかわかりませんが(-_-;)
KiyoshiMotoki

2015/10/14 17:51 編集

"<IfModule mod_rewrite.c>"と"</IfModule>"の2行を削除して、Apacheを再起動してみてください。 もしmod_rewriteモジュールが有効になっていなければ、起動できなくなるか、何かしらのエラーが表示されるはずです。 http://httpd.apache.org/docs/2.2/mod/core.html#ifmodule mod_rewriteモジュールが無効になっていて、Apacheのバージョンが2.1以上の場合、"<IfModule mod_rewrite.c>"を"<IfModule rewrite_module>"に変更してみてください。 http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html mod_rewriteモジュールが有効だった場合(正常にApacheが起動してしまった場合)、以下のリンクが参考になるかもしれません。 http://d.hatena.ne.jp/pcmaster/20090207/p3 http://d.hatena.ne.jp/pcmaster/20090607/p1
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問