※ ChatGPTを利用し、要約された質問です(原文:CakePHPの .htaccess設定について)
CakePHPの.htaccess設定について
このQ&Aのポイント
CakePHPをVPSで構築したサーバーにインストールしましたが、.htaccessの設定がうまくいかず困っています。
フォームの実験を行った際に、フォーム送信後のURL表示がうまくいっていません。
「htaccessファイル1」(アプリケーション)、「htaccessファイル2」(公開)、および「htaccessファイル3」(コア)の設定内容について疑問点があります。
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]の部分はこのままで良いのか?
お礼
ご回答ありがとうございます。 .htaccessは公開ディレクトリーでしか動作しない点は、頭から抜けてしまっていました。 ご指摘ありがとうございます。 URLの部分の詳しい説明、大変参考になりました。 無事、問題が解決しました。