お世話になります。

CakePHP の mod_rewrite 設定について質問です。

CakePHP を個人ローカル環境で動かしたいです。例を挙げると
  http://localhost/~foo/cakedemo/
で、cake のブログ・チュートリアルが動いています。まずここで、mod_rewrite が巧くいかなかったので、core.php の
  define ('BASE_URL', env('SCRIPT_NAME'));
をコメント・アウトしてブログを作成、稼働を確認しました。ただし投稿後 flash 画面からの自動遷移などが動きません。そこで本来の通り mod_rewrite を使ってみようと考えました。

この状況下で
  http://localhost/~foo/cakedemo/
にアクセスすると、インデックス・ページが表示されますが、投稿の編集画面に移動しようとすると、
  http://localhost/posts/edit/1
のようになり、存在しない URL へのアクセスで失敗します。こんな場合に
  http://localhost/~foo/cakedemo/posts/edit/1
というふうにアクセスしたいのです。ですが、RewriteBase を自分なりに設定しても問題を解決できませんでした。

このような場合に .htaccess(3種)をどのように設定すればいいのでしょうか? ローカルで mod_rewrite して動かすことはできないのでしょうか?

どうぞ御知恵を拝借させてください。

回答の条件
  • 1人2回まで
  • 登録:2007/10/02 16:37:07
  • 終了:2007/10/03 15:11:14

回答(3件)

id:ktoshi No.1

ktoshi回答回数107ベストアンサー獲得回数62007/10/02 18:13:51

ポイント25pt

http://cakephp.jp/doc/apas12.html

Example A.14. /app/views/posts/index.thtml (edit リンクの追加)

<?php echo $html->link('編集', '/posts/edit/'.$post['Post']['id']);?>

<?php echo $html->link('編集', '/~foo/cakedemo/posts/edit/'.$post['Post']['id']);?>

にする。

こういう事ではなくてmod_rewriteを利用してという事でしたら、間違った回答なのでごめんなさい。

id:renpoo

ありがとうございます。

次善の回答としては十分ですね。

でも、いちおう mod_rewrite の利用で解決できるかどうか、ひきつづき回答を募集させてください。

2007/10/02 18:33:01
id:tkyk3 No.2

tkyk3回答回数59ベストアンサー獲得回数62007/10/02 19:00:16

ポイント20pt

Apacheの設定は如何でしょうか。

http://cakephp.seesaa.net/article/22916222.html

(Apacheを動かしていると思われますが、もしも別のhttpサーバによる稼働ですと、Apacheの機能であるmod_rewriteは使えません。一応…。違っていたらごめんなさい。)

id:renpoo

若干、情報がたりなかったのでしょうが当然 Apache2 が ubuntu 上で動いていて、

  AllowOverRide All

になっています。.htaccess での上書き設定が効いているのでちゃんと稼働しているように思われますが、もし、不完全な稼働になっているのならば、お手数ですがチェック方法を教えてください。

2007/10/02 19:04:40
id:tezcello No.3

tezcello回答回数459ベストアンサー獲得回数692007/10/02 23:01:23

ポイント35pt

CakePHP を使った事がないので、ざっと調べた範囲でお答えします。大幅にハズしている可能性もありますので、その際はご容赦下さい。(当然ポイント不要です)


まず、ページ遷移の際に目的としていないページを見に行ってしまっている様ですが、これは mod_rewrite には関係なく、CakePHP の設定ミスでしょう。

CakePHP の本体があるディレクトリ(? /home/foo/public_html/cakedemo でしょうか?)にある index.php で、

define ('APP_DIR', '○○○○');

としている所があるらしいのですが、これを修正し忘れていませんか?

ご質問の場合、

define ('APP_DIR', '/~foo/cakedemo');

この様になるのではないでしょうか?

http://cakephp.jp/doc/ch03s04.html#id4797748 を参考にしました。


次に .htaccess の設置場所が変な気がします。

/~foo/cakedemo/ の実態が、/home/foo/public_html/cakedemo/ であるなら、

/home/foo/proj/cakedemo/.htaccess

/home/foo/proj/cakedemo/app/.htaccess

/home/foo/proj/cakedemo/app/webroot/.htaccess

を設置しても、全く参照されません。

/~foo/cakedemo/posts/edit/1 へのアクセスを

/~foo/cakedemo/index.php?url=posts/edit/1 の様に書き換えたいのなら、

/home/foo/public_html/cakedemo/.htaccess に記述する事になると思います。


ところで、3個も .htaccess が必要なんですか?

app や app/webroot へパスしなくてもいい様に思うのですが。


で、.htaccess の内容については、上の例の様な置き換えならコメント欄に書かれている最後のファイルの記述だけでいい様に思うのですが。(/home/foo/proj/cakedemo/app/webroot/.htaccess を /home/foo/public_html/cakedemo/ に移動する)

  蛇足ですが、.htaccess 内で

  <IfModule mod_rewrite.c>〜</IfModule>

  としなくてもいい様に思います。

  mod_rewrite モジュールが読み込まれていて、有効になっていないと

  .htaccess ファイルを読んでもくれませんから。

id:renpoo

おかげでカスタム・セットアップのために2種の index.php (/cakedemo 以下と /cakedemo/app/webroot 以下)にパス設定が必要なことが分かりました。

しかし、実際にお使いでない所為か的外れの部分も散見されます。段階的な .htaccess 設定になっているのは、そういった動作をするように作りこまれているからに思えてなりません。

たとえば通常の設定の場合

  http://www.cakedemo.com/

によって、インデックス・ページが表示され、

  http://www.cakedemo.com/posts/add

では新規投稿ページが表示され、

  http://www.cakedemo.com/posts/edit/1

では投稿(1)についての編集ページが表示されます。この背景では各階層の index.php が処理の振り分けを担当しているようです。

逆に言うと、こんな作りになっているから、自分の手に負えず、こうやって質問させていただいています。


########

解答には近づいてきているようですが、やはり実際に cake をお使いの方に訊くしかないようです。急ぎなのですが、仕方ありません。http://cakephp.jp/ のほうで質問してみようかと思います。

お世話になりました。

2007/10/03 15:09:23
  • id:renpoo
    補足します。

    そこで現在の .htaccess(3種)はこうなっています(デフォルト状態)。
    /home/foo/proj/cakedemo/.htaccess :
    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^$ app/webroot/ [L]
    RewriteRule (.*) app/webroot/$1 [L]
    </IfModule>

    /home/foo/proj/cakedemo/app/.htaccess :
    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^$ webroot/ [L]
    RewriteRule (.*) webroot/$1 [L]
    </IfModule>

    /home/foo/proj/cakedemo/app/webroot/.htaccess :
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </IfModule>


    また、apache2 のエラー・ログを見ると

      [Tue Oct 02 16:21:04 2007] [error] [client 127.0.1.1] File does not exist: /var/w
    ww/posts, referer: http://localhost/~foo/cakedemo/

    となってしまっており、apache2 デフォルトの領域を見ようとしていますが、これを個人ローカル環境(/home/foo/public_html/cakedemo)を参照するようにしたいのです。

    宜しくお願いします。
  • id:ktoshi
    http://localhost/posts/edit/1

    に対してmod_rewriteを適用するということは、

    /var/www/ (/var/www/が公開ディレクトリ?)

    に.htaccessを置くということ?

    「編集」にマウスを合わせるとリンクはhttp://localhost/posts/edit/1となっていると思うので、ここが変わらない限りは/var/www/に.htaccessを置くってことなのでしょうか?
  • id:renpoo
    コメントありがとうございます。
    まず、Cake のデフォルト設定で先ほどいただいた策を施しても、“index.php”の部分が中途半端で解決できず、巧く行きません。たしかに

    <?php echo $html->link('編集', '/~foo/cakedemo/posts/edit/'.$post['Post']['id']);?>

    とするのは必要なプロセスのひとつかもしれませんが、それによって /~foo/cakedemo 以下に誘導できても、もう1段階の改造をしなければダメなのでしょう。

    いま関わっている仕事は、いろいろなサイトへのリリースが予定されており、設置場所も一定ではありません。そのために、なにか好い方法はないものか?と模索しています。
  • id:tkyk3
    設置される場合は、きっと独自ドメインなどでしょうから、Apacheの設定で、http://localhost:8080/などでアクセスできるようにすれば、良いかなあと思うのですが…ご希望の形でないようでしたらすみません。
  • id:ktoshi
    <?php echo $html->link('編集', '/posts/edit/'.$post['Post']['id']);?>

    http://localhost/~foo/cakedemo/posts/edit/1
    にリンクするようにするのであれば、htmlヘルパーを修正するか拡張すればできるのではないでしょうか。

    /cake/libs/view/helpers/html.php(を/app/view/helpers/にコピーするかして利用)にある
    var $base = null;
    あたりで指定できそうな感じもしますが、わたしはやったことないので分かりません、、、
    適当ですみません。
  • id:renpoo
    >tkyk3 さんへ

    逆に独自ドメインへの設置はほとんど見込めず、既存ドメイン内の特定の場所での稼働が見込まれるので、今回のような質問をしています。

    >ktoshi さんへ

    繰り返しになりますが、

      >http://localhost/~foo/cakedemo/posts/edit/1

    は実態として

      >http://localhost/~foo/cakedemo/index.php/posts/edit/1

    のように index.php が挟まった形になって解決されないと、きちんと動きません。その点では tezcello さんの教えてくれた、ROOT 設定の方が正しい対処なのでしょう。
  • id:ktoshi
    質問内容の一部
    > この状況下で
    >   http://localhost/~foo/cakedemo/
    > にアクセスすると、インデックス・ページが表示されますが、投稿の編集画面に移動しようとすると、
    >   http://localhost/posts/edit/1
    > のようになり、存在しない URL へのアクセスで失敗します。こんな場合に
    >   http://localhost/~foo/cakedemo/posts/edit/1
    > というふうにアクセスしたいのです。


    インデックスページから
    http://localhost/~foo/cakedemo/posts/edit/1
    にリンクされず、
    http://localhost/posts/edit/1
    にリンクされてしまうのは、インデックスページの問題で、

    http://localhost/~foo/cakedemo/posts/edit/1
    に飛んだ後の処理はcake側でやってくれることなので、↓は作り手が気にすることではないのではないでしょうか。

    > のように index.php が挟まった形になって解決されないと、きちんと動きません。

    それとも
    http://localhost/~foo/cakedemo/posts/edit/1
    をブラウザのアドレスバーに直接入力してページを開いても編集ページが表示されないという問題なのでしょうか?


    追伸1
    1の私の回答は間違ってました。無駄にポイント使わせてしまって申し訳ありませんでした。

    追伸2
    わたしは、http://localhost/test/ でcakeを試していますが、.htaccessを変更しなくても問題なく動いています。
    チュートリアルも前に試したことありますが問題はなかったように記憶しています。
    ちなみに/testの直下にcakeを入れています。
    /test
     /app
     /cake
     /docs
     /vendors
     /index.php
  • id:renpoo
    ありがとうございます。

    >それとも
    >http://localhost/~foo/cakedemo/posts/edit/1
    >をブラウザのアドレスバーに直接入力してページを開いても編集ページが表示されないという問題なのでしょうか?

    そのとおりです。きちんと動きません。

    >ちなみに/testの直下にcakeを入れています。

    Apache のエラー・メッセージをご覧になればお分かりのとおり、/var/www 以下を参照しに行ってしまい、ローカルの /home/foo/public_html/cakedemo 以下の領域を見に行ってくれないのが、今回の問題の原因かと思っています。

    わたしとしてはもし Cake を使用する場合、多くのサーヴァーに個別インストールする必要性のある仕事をしているので、設置場所のカスタマイズを要領よく行える方法を模索しています。対象サーヴァーではすでにほかのシステムが動いていたりして、その配下に設置されることが強く予想されるからです。

  • id:ktoshi
    > にアクセスすると、インデックス・ページが表示されますが、投稿の編集画面に移動しようとすると、
    >   http://localhost/posts/edit/1
    > のようになり、存在しない URL へのアクセスで失敗します。

    Apache のエラー・メッセージは、(http://localhost/~foo/cakedemo/posts/edit/1ではなく)上記の場合のログだと思うのですが、そうなると、/var/www/posts は存在しないのでエラーが出るのではないでしょうか?

    それと、
    /var/www/~foo -> /home/foo/proj
    のようにリンクされてるのですよね?
  • id:renpoo
    Apache のほうの設定は
    >/var/www/~foo -> /home/foo/proj
    のようにはなっていません。

    /home/foo/root -> /home/foo/public_html/
    /home/foo/public_html/cakedemo -> /home/foo/proj/cakedemo/

    と2段構えになっています。まだ Apache 初心者のために婉曲的になっていますが、とにかく個人ユーザーのホーム・ディレクトリの中の開発ディレクトリ上で、明示的にリンクされたものだけ参照できるようにしたかったのです。



  • id:ktoshi
    DocumentRootは、/var/www ではないのですか?
    http://www.magic3.org/sarucast/index.php?DocumentRoot

    もし /var/www 以外の場所に設定してるのに下のようなエラーが出てるとすれば、わたしには分かりません。お役に立てなくて申し訳ないです。

    > [Tue Oct 02 16:21:04 2007] [error] [client 127.0.1.1] File does not exist: /var/www/posts, referer: http://localhost/~foo/cakedemo/
  • id:renpoo
    DocumentRootは、/var/www ではありません。
    そこでは Apache のテスト用サイトしか動いてません。

    必要ならばシンボリック・リンクなどで対応しますが、開発中のプロジェクトはワーキング・ディレクトリの中でやりたいのです。

    こちらのほうが常識はずれな設定をしているのならば、修正します。
  • id:ktoshi
    > DocumentRootは、/var/www ではありません。
    > そこでは Apache のテスト用サイトしか動いてません。

    「そこでは」のそこはどこのことでしょうか?/var/wwwではないですよね?

    http://localhost/posts/edit/1
    にアクセスしたときに、
    > File does not exist: /var/www/posts,
    (/var/www/postsが存在しない)
    とエラーが出てるってことは、DocumentRootが/var/wwwに設定してあることだと思うのですが、違うのかなあ。

    httpd.confでDocumentRootを/var/www以外に指定してるんですよね。すみません。お手上げです。
  • id:renpoo
    すみません。勘違いをしていました。
    DocumentRootは、/var/www です。

    それを /etc/apache2/sites-available で設定しています。さらにその設定ファイルの中で“/”、“/var/www”、“/home/*/public_html/*”のようにして設定しています。つまり個人環境の public_html 以下が Apache で閲覧できるように追加している、ということです。

    もし、DocumentRoot を設定しなおせばいいのならそうしますが、そうすると Cake のプロジェクトを複数立ち上げたりするのにもトリッキーな方法が必要になりそうで躊躇してしまいます。

    それとも DocumentRoot を適切に設定すれば、Cake のプロジェクトごとに Cake の Root などを設定して動かしてやることが可能なのでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません