dポイントプレゼントキャンペーン実施中!

CakePHPをVPSで構築したサーバー(Linux)にインストールしました。
.htaccess(mod_rewrite)の設定がうまくいっていないようなので対処の方法を教えてください。

[環境]
PHP 5.3.3
Apache 2.3.3
CakePHP 1.3.15


mod_rewriteが動いてるのはチェック用のプログラムで確認しました。
controllerとViewファイルを作り、文字の表示は成功しています。

フォームの実験を行った時にフォーム送信後のURL表示がうまくいっていません。(get/post共に)

[書籍を参考にしたプログラム]
Sampleコントローラーを作り、Viewの中にSampleディレクトリを作りその中にindex.ctpファイルを設置。フォームにテキストを入力して送信ボタンを押すと、テキストが表示されるプログラムです。

[コントローラー]sample_controller.php
class HelloController extends AppController {
public $name = 'Hello';
public $uses = null;
public $layout = "hello";

function index(){}

function sendForm(){
~フォームで送られたテキストを表示(プログラムは省略)~
}
}

[index.ctp]のフォームのHTML
<form method="post" action="./sendForm">
~省略~
<input type="submit" />
</form>

http://www.example.com/sampleでフォームを開きテキストを入力して送信ボタンを押すと http://www/example.com/sample/sendForm というURLになるはずなのですが、
http://www.example.com/sendForm となってしまいます。

試しにブラウザから「http://www/example.com/sample/sendForm」というURLを入力してみますと、フォームで入力したデータは表示されませんが、ページ自体は表示されます。
もう一つ、index.ctpの<form method="post" action="./sendForm">のアクションのパスを /sample/sendForm に変更してみますとデータも表示され、求めた結果になります。

以前、別の環境でこのプログラムを動かしたときは、<form method="post" action="./sendForm">のままでうまくいったので、.htaccessのファイルの設定に問題があると予想されます。

下記にcakePHPの設定情報を記載しますので、間違っている部分を指摘していただければと思います。

※ディレクトリの構成は下記のページの「3.4.3. 高度なセットアップ:その他のインストール方法」を参考にしています。
http://cakephp.jp/old_doc/ch03s04.html

[アプリケーションディレクトリ]
/home
____/me
________/mysite
____________/config
____________/controllers
____________/models
____________/plugins
____________/tmp
____________/vendors
____________/views
____________index.php
____________.htaccess→「htaccessファイル1」●

[公開ディレクトリ]
/var
____/www
________/html
____________/example.com→ドキュメントルート
_______________/css
_______________/files
_______________/img
_______________/js
_______________.htaccess→「htaccessファイル2」●
_______________css.php
_______________favicon.ico
_______________index.php

[コアファイルディレクトリ]
/usr
____/lib
________/cake
____________/cake
________________/config
________________/docs
________________/libs
________________/scripts
________________app_controller.php
________________app_model.php
________________basics.php
________________bootstrap.php
________________dispatcher.php
____________/vendors
____________/plugins
____________index.php
____________.htaccess→「htaccessファイル3」●



「htaccessファイル1」(アプリケーション)
--------------------------------------------------
<IfModule mod_rewrite.c>
RewriteEngine on
  RewriteBase /cake/app→■追加 
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
</IfModule>
-------------------------------------------------

「htaccessファイル2」(公開)
--------------------------------------------------
<IfModule mod_rewrite.c>
RewriteEngine On
  RewriteBase / →■追加
 RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
--------------------------------------------------

「htaccessファイル3」(コア)
--------------------------------------------------
<IfModule mod_rewrite.c>
RewriteEngine on
  RewriteBase /cake→■追加
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
--------------------------------------------------

疑問点は下記のようになっています。
(1)追加した部分のRewriteBaseはこれで良いのか?
(2)RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
の部分はこのままで良いのか?webroot部分の変更は必要か?
(3)RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]の部分はこのままで良いのか?

A 回答 (2件)

apache サーバーでは、 .htaccess は公開ディレクトリーにあるものしか見ません。


よって、/var/www/html/example.com のドキュメントルートにある「htaccessファイル2」のみが実質動作します。あとの2つの.htaccess は読み込まれない場所にあるので、置いておく意味もありません。参考リンク先でも、.htaccess は一つですし。
「htaccessファイル2」の記述は、ほぼ配布元と同じなので、問題なく動作していると思います。
ドキュメントルートのindex.php から開始するなら、RewriteBaseは不要かとも思いますけど。

あと問題の url http://www.example.com/sample でアクセスしているときに <form action='./sendform' >とすると、http://www.example.com/sendform へ送信されるのは、ブラウザの仕様です。
http://www.example.com/sample/ のurlでform表示する必要があります。actionメソッド名index は省略可能だけど controllerの後方の / は省略しないこと。ブラウザが判断するディレクトリー区分が違ってしまいます。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
.htaccessは公開ディレクトリーでしか動作しない点は、頭から抜けてしまっていました。
ご指摘ありがとうございます。

URLの部分の詳しい説明、大変参考になりました。
無事、問題が解決しました。

お礼日時:2012/12/22 14:01

httpd.conf


-------------------------
#AllowOverride None

AllowOverride ALL
-------------------------

おそらく2か所
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
httpd.conf の設定はうまくできていましたので、
うまくいかないのはこれ以外の原因だったようです。

お礼日時:2012/12/22 13:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!