CakePHPの.htaccess設定について

このQ&Aのポイント
  • CakePHPをVPSで構築したサーバーにインストールしましたが、.htaccessの設定がうまくいかず困っています。
  • フォームの実験を行った際に、フォーム送信後のURL表示がうまくいっていません。
  • 「htaccessファイル1」(アプリケーション)、「htaccessファイル2」(公開)、および「htaccessファイル3」(コア)の設定内容について疑問点があります。
回答を見る
  • ベストアンサー

CakePHPの .htaccess設定について

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]の部分はこのままで良いのか?

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答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の後方の / は省略しないこと。ブラウザが判断するディレクトリー区分が違ってしまいます。

hpmt28
質問者

お礼

ご回答ありがとうございます。 .htaccessは公開ディレクトリーでしか動作しない点は、頭から抜けてしまっていました。 ご指摘ありがとうございます。 URLの部分の詳しい説明、大変参考になりました。 無事、問題が解決しました。

その他の回答 (1)

  • nikogoo
  • ベストアンサー率21% (18/85)
回答No.1

httpd.conf ------------------------- #AllowOverride None ↓ AllowOverride ALL ------------------------- おそらく2か所

hpmt28
質問者

お礼

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

関連するQ&A

  • cakephpで特定ファイル表示(htaccess

    CakePHPではURLを一度index.phpにリダイレクトするような作りになっていますが、Googleの検索エンジン用のsitemap.xmlファイルを公開ディレクトリに置いた場合、そのファイルだけはmod_rewriteのルールから外して、普通にブラウザで見れる状態にしたいです。 .htaccessをどのように設定すれば良いか、教えてください。 なお、CakePHPのindex.phpファイルと.htaccess、sitemap.xmlは同じディレクトリに置いてあります。 [環境]CakePHP 1.3 PHP5.3 現在は.htaccessは以下のように設定されています。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> 上記の RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] の前の行に RewriteCond %{REQUEST_FILENAME} ^sitemap.xml を入れるとこのファイル自体はブラウザから見れるようになりますが、サイトのトップページ以外を見ようとすると、「Not Found」が返ってきてしまいます。

    • ベストアンサー
    • PHP
  • CakePHP1.2でCSSが適用されない

    レンタルサーバーはXREAで、 PHP Version 4.4.8 + CakePHP 1.2.0.7692 RC3 + Apache 10337100 を使っています(phpinfo()にて取得)。 http://d.hatena.ne.jp/Yukkuri/20080519/1211221064 こちらのサイトを参考に接地し、CakePHPのスタート画面は出たのですが、 スタイルシートや画像が適用されてくれません。 mod_rewrite関係だと思うのですが、phpinfo()を見る限りでは mod_rewriteは読み込まれているようです。 .htaccessは以下のようになっています。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /cgi/anketo/ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> 他に設定すべき項目などありましたら教えていただけないでしょうか。

    • 締切済み
    • PHP
  • CakePHPの表示エラーについて

    --------------------------- CakePHPバージョン:1.3.14. PHPバージョン:5.3.3 Apacheバージョン:2.2.3 --------------------------- CakePHPを始めたばかりです。 インストールを完了し、トップページでのhello world!の表示は出来ました。 (トップページだけは特例のようですね) http://www.example.com/test/hello という形でhello world!を表示させたいと思い下記のようにファイルを作りUPしましたが、エラーが表示されてしまいました。 何を変更すればうまくファイルが表示されるのかを教えていただければと思います。 test_controller.php ---------------------------------------------------------- class TestController extends AppController { public $name = "Test"; public $uses = null; public $autoRender = true; function index(){ } function hello(){ $this->set("content", "Hello World!"); } } ---------------------------------------------------------- http://www.example.com/test/hello (エラーメッセージ) ------------------------------------------------------------------------------- Warning: include(cake/bootstrap.php): failed to open stream: No such file or directory in /var/www/html/example.com/test.php on line 76 Warning: include(): Failed opening 'cake/bootstrap.php' for inclusion (include_path='/var/www:/var/www/html/:.:/php/includes:/usr/share/pear') in /var/www/html/example.com/test.php on line 76 Fatal error: CakePHP core could not be found. Check the value of CAKE_CORE_INCLUDE_PATH in APP/webroot/index.php. It should point to the directory containing your /cake core directory and your /vendors root directory. in /var/www/html/example.com/test.php on line 77 ------------------------------------------------------------------------------- bootstrap.phpというファイル名が出てきているので、bootstrap.phpを見てみましたが何が間違っているのかはわかりません。 include_pathも出てきているので、cakephpのパスを通しておく必要があるのでしょうか? bootstrap.php ------------------------------------------------------------- if (!defined('PHP5')) { define('PHP5', (PHP_VERSION >= 5)); } if (!defined('E_DEPRECATED')) { define('E_DEPRECATED', 8192); } error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT); require CORE_PATH . 'cake' . DS . 'basics.php'; $TIME_START = getMicrotime(); require CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php'; require LIBS . 'object.php'; require LIBS . 'inflector.php'; require LIBS . 'configure.php'; require LIBS . 'set.php'; require LIBS . 'cache.php'; Configure::getInstance(); require CAKE . 'dispatcher.php'; ------------------------------------------------------------- (全体の設定状況など) .htaccess httpd.conf あたりの設定が間違っているのかと思い、ネットで情報を調べていろいろ変更したりしてみましたがダメでした。 あと一つ気になる点としては、公開ディレクトリ以外をUPしているディレクトリ名をcakeにしてしまっているところです。(cakeというディレクトリ名はダメとかあるのでしょうか?) ディレクトリの構成と設定の内容を下記に記載します。 [/var/cake]プログラムファイル /var/cake/app /var/cake/plugins /var/cake/vendors /var/cake/.htaccess /var/cake/index.php 公開ディレクトリ(ルート) css files img js .htaccess css.php index.php ############################################################## .htaccessの設定 ############################################################## 3か所ほど設定すべきところがあるようなので下記のように設定しました。 /var/cake/.htaccess ------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /cake RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule> ------------------------------------------------- /var/cake/app ------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine on RewriteBase /cake/app  RewriteRule ^$ webroot/ [L] RewriteRule (.*) webroot/$1 [L] </IfModule> ------------------------------------------------- 公開ディレクトリの.htaccessの設定 ------------------------------------------------- <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /  RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !\.(cgi|css|gif|jp?g|png)$ RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule> -------------------------------------------------

    • ベストアンサー
    • PHP
  • .htaccessのRewriteRuleの設定

    Sabelというフレームワークでtest用プロジェクトを作成して、 testフォルダ  addonフォルダ  appフォルダ     ・     ・     ・  publicフォルダ   .htaccessファイル というフォルダ構造で、publicフォルダの中に.htaccessファイルがあり内容は [.htaccessファイル] <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} \/\..+$ RewriteRule .* /notfound [R,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule !\.(js|ico|gif|jpg|png|bmp|swf|css|html)$ index.php [QSA,L] </IfModule> URLからのアクセスは、 http://localhost/test/public/index.php/index/index と入力するとちゃんとindexコントローラのページが表示できます(http://localhost/test/public/index.phpでもアクセスできます) ですが自分としては、 http://localhost/test/public/index/index とindex.phpを抜かしてアクセスさせたいのですが、 この.htaccessファイルのままでは、 「404 Not Found 該当するページが見つかりません。 ページは削除されたか、移動された可能性があります。 」 のページになってしまいます・・・ なにを記述すればindex.phpなしでアクセスできるようになるのでしょうか? Sabel ドキュメントとか(非公式) http://ebine.org/sabel/doc/index.html

    • 締切済み
    • PHP
  • htaccess rewrite 無限ループ

    すでにあるサイトにhtaccessを設置して、 rewriteで日本語のファイル名でアクセスさせる方法を模索しています。 例↓ ・「http://www.example.jp/index.php」でアクセスされたら「http://www.example.jp/インデックス」 にリダイレクト。 ・「http://www.example.jp/インデックス」でアクセスされたら「index.php」 を表示させる。 htaccessの例↓ Options +FollowSymLinks RewriteEngine on RewriteRule ^index\.php$ /インデックス [R=301,L] RewriteRule ^インデックス$ index.php [L] 上記の設定だと無限ループになってしまいます。 index.phpでアクセスされたら404を返す方法も考えましたが・・・もっといい方法はないでしょうか?

    • ベストアンサー
    • PHP
  • リダイレクトのhtaccessを置くと403エラー

    perlで書いたCGIファイルがあるのですが、スマホ用のリダイレクトhtaccessファイルをトップディレクトリに置いた所、CGIのページが403エラーになってしまいました。 .htaccessファイルを外すと正常に表示するので、原因は.htaccessなのですが、理由が思い当たりません。 CGIのソースは出せないですが、お問い合せフォーム用のCGIです。 何かお気づきの点がありましたら助言お願い致します。 ● .htaccess(トップディレクトリに設置) <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !/sp/ RewriteCond %{HTTP_USER_AGENT} (iPhone|Android.*Mobile|Windows.*Phone) RewriteRule ^(.*)$ sp/$1 [R] RewriteBase / RewriteCond %{REQUEST_URI} /sp/ RewriteCond %{HTTP_USER_AGENT} !(iPhone|Android.*Mobile|Windows.*Phone) RewriteRule ^sp/(.*)$ $1 [R] RewriteBase / </IfModule> ● ディレクトリ構造 /index.html・・・トップページ /.htaccess・・・上記内容 /contact/all/index.cgi・・・403エラーになるCGI /contact/all/.htaccess・・・「Options ExecCGI」のみ記述 /sp/・・・スマホ用のリダイレクト先ディレクトリ(以下略)

  • mod_rewriteについて教えてください。

    mod_rewriteについてお願いします。 「a」と「b」というフォルダにそれぞれ「index.html」「test.html」が入っています。「a」と「b」で「index.html」「test.html」の内容はちがいます。 わたしが一番望んでいるのは http://example.com/a/以下にアクセスがあった場合 http://example.com/b/以下にリダイレクトさせるというものです。 例) http://example.com/a/test.htmlにアクセスがあったらhttp://example.com/b/test.htmlにリダイレクト。 ------------------------------------------------------------ Options +FollowSymLinks AddHandler cgi-script htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^/a/$ /b/$1 [R=302,L] </IfModule> ------------------------------------------------------------ としてみましたが、リダイレクトされません。 ちなみに RewriteRule ^$ /b/$1 [R=302,L] と書くと、http://example.com/にアクセスがあった場合 http://example.com/b/にリダイレクトされましたので mod_rewriteには対応しております。 ご教授のほど、よろしくお願いいたします。

  • .htaccessの書き方について

    http://www.example.com/abc/ の場合 URLはそのままで、内容は /main/abc/以下 (の同名ファイル)を表示したい場合、 .htaccess に以下のように色々試したのですが、うまく動作しません。 どこがいけないでしょうか。 ----- RewriteBase / RewriteRule ^/(.*)/$ /main/$1/ ----- ----- RewriteBase / RewriteRule ^(.*)$ /main/$1 [L] ----- ----- RewriteBase / RewriteRule ^/(.*)/(.*)$ /main/$1/$2 -----

  • アドレスの最後に/が無い場合、/ありのアドレスに飛ばしたい

    mod_rewrite を使って、静的なページのようにアドレスを表示させました。 http://****.jp/page/10/ このようなアドレスでアクセスできるのですが、アドレスの最後のスラッシュがなくてもアクセスする事が出来ます。 http://****.jp/page/10 ←スラッシュがない そこで、アドレスの最後のスラッシュがないアドレスにアクセスした場合、スラッシュありのアドレスに飛ばすにはどの様にすればいいのでしょうか? .htaccessは、下記のようにしています。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /page/index.php [L] </IfModule>

  • Apache mod_rewriteが .htaccess ではうまく適用できない

    mod_rewriteで書き換えに挑戦しているのですが、うまく動いてくれません。 やりたいことは、 http://www.example.com/ 以下をすべて http://www.example.com/index.php に書き換えたい。 開発中は直接 httpd.conf を編集できるため RewriteEngine on RewriteRule ^/((?!css|js|img).*)$ /index.php?&%{QUERY_STRING} [L] 上記で問題なく動いているのですが、htaccessではinternal errorかACCESS forbidden, object notfound などでうまく以後来ません。 ためしに、 RewriteRule aaa index.php?&%{QUERY_STRING} [L] として、http://www.example.com/aaa にアクセスしても object notfound が返ってきます。 ^aaa としたり ^aaa$ としたり、いろいろ試してるのですが全滅・・・ 検索して見つかったサンプルなどをそのままコピーしても使えません。 ちなみに、開発環境では Apache2.2.4。 公開用では 1.3系 の予定です。 Apache2.2.4 の httpd.conf ではOK。htaccess ではOUT。 難しい・・・

専門家に質問してみよう