
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]の部分はこのままで良いのか?
No.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の後方の / は省略しないこと。ブラウザが判断するディレクトリー区分が違ってしまいます。
ご回答ありがとうございます。
.htaccessは公開ディレクトリーでしか動作しない点は、頭から抜けてしまっていました。
ご指摘ありがとうございます。
URLの部分の詳しい説明、大変参考になりました。
無事、問題が解決しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) .htaccessファイルの修正がこれで問題ないかどうか 1 2022/04/21 08:42
- WordPress(ワードプレス) httpからhttpsへのリダイレクト設定について 2 2022/04/17 09:49
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- その他(開発・運用・管理) 【至急】.htaccessによるディレクトリ単位でのリダイレクト 2 2023/08/10 13:46
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
URLが.PHPってどういう...
-
sqlite_open、SQLite3::open
-
.phpと.incファイルの違いはな...
-
[PHP] 標準の関数について
-
chmod と 所有者apache
-
fputs()はfwrite()のエイリアス...
-
バイナリーデータをGIFで表示さ...
-
session_start()でwarningが表...
-
.phpファイルが、表示されない
-
PHPを使ってのサーバ上ファイル...
-
ウィルスバスターを入れたら共...
-
PHP内 メールアドレス 暗号化...
-
【file_exists】ファイルが存在...
-
Linuxでphpファイルが認識されない
-
PHPでフォルダ選択ダイアログを...
-
サーバ無しでphpを動作させる
-
phpで外部ファイルを取り込み変...
-
PHPファイルの中身が見られるこ...
-
phpでgifアニメかどうかチェッ...
-
PHPのif文でその処理を途中で抜...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
.phpと.incファイルの違いはな...
-
.phpファイルが、表示されない
-
【file_exists】ファイルが存在...
-
URLが.PHPってどういう...
-
PHPを使ってのサーバ上ファイル...
-
EUC_JP と EUC-JP
-
htdocsフォルダ以外ではPHP...
-
さくらレンタルサーバーでPHPが...
-
htmlspecialcharsが機能してい...
-
CakePHPの .htaccess設定について
-
PHPでフォルダ選択ダイアログを...
-
PHPの戻り値をWINDOWSバッチフ...
-
phpのファイル制御関数について...
-
サーバ無しでphpを動作させる
-
別のドメインのファイルをrequire
-
サイトのphpソースコードを表示...
-
sendmailのパス指定方法
-
apacheで拡張子を省略してアク...
-
クラスが使えない。
-
session_start()でwarningが表...
おすすめ情報