1

私は CakePHP 2.2.0 を使用しており、この種のページを取得するルートを 1 つ作成する必要があります。

http://www.example.com/users/mypage.php

Cakephp のドキュメントに従って、このページを見つけました: http://book.cakephp.org/2.0/en/development/routing.html#file-extensions

私が使用しなければならないことを読んだ場所:

Router::parseExtensions('php');

この行をroutes.phpファイル(ルートの上)に追加し、このルートを追加しました:

Router::connect('/users/mypage.php', array('controller' => 'users', 'action' => 'mypage'));

そこで、UsersController 内にこのアクションを追加しました。

残念ながら、 www.example.com/users/mypage正常に動作するように送信されたリクエストのみ (mypage アクションが呼び出されます) を試してみるwww.example.com/users/mypage.phpと、404 not found エラーが発生します。

ドキュメントにあるように、私はその理由を本当に理解していません:

これにより、一致するファイル拡張子をすべて削除し、残っているものを解析するようルーターに指示します。

したがって、それはまさに私が必要とするものです。ユーザーが /users/mypage.php (拡張子付き) を入力したときにmypageアクションが呼び出されることを (このアクションに対してのみ)解釈する必要があります。

他には何も追加しませんでした。AppController はデフォルトであり、私の UsersController には mypage() メソッドしかありません。

NGINX に問題があるかどうかはわかりませんが、以下にドメインの構成を書きます。

server {
        listen 80;
        server_name www.example.com;
        root /home/users/example.com/www/app/webroot/;

        access_log /home/users/example.com/log/access.log;
        error_log /home/users/example.com/log/error.log;

        location / {
                index index.php index.html;
                try_files $uri $uri/ /index.php?$uri&$args;
        }

        location ~* \.php$ {
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                include         /etc/nginx/fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        }
}

質問は明確だと思います。リクエストに拡張子がある場合、特定のコントローラーのアクションにリクエストをルーティングする方法は?

私は欲しい:

www.example.com/users/mypage.php ==> to UsersController mypage()
4

2 に答える 2

2

まず、parseExtensions() を使用するか、connect() で URL テンプレートに「.php」を追加します。両方を同時に使用することはできません。どちらを選択するにしても、実験をお勧めします。「php5」などの他の拡張子を使用してみて、問題なく動作することを確認してください。したがって、明らかにあなたの問題はnginx構成です:

location ~* \.php$ {
    ...
}

これらの行は、ファイル システム内のハード ファイルとして .php で終わる URL 内のすべてを解析するように nginx に指示しています。これを克服するのは簡単ではありません。別のスクリプトへのフォールバックを持つそのディレクティブで try_files を使用できますが、これはトリッキーですが、単に別の拡張子を url に使用することもできます :)

これがあなたがしなければならないことの良いヒントになることを願っています。

于 2012-07-17T20:36:55.583 に答える
0

これは、cakephp 2.2.1 の私の nginx.conf です。

server {
    listen       80;
    server_name  localhost;
    error_log /var/log/nginx/errordebug.log debug;

    location / {
        index index.php;
        try_files $uri $uri/  @cakephp;
        expires max;
        access_log off;
    }
    location @cakephp {
       fastcgi_param SCRIPT_NAME /index.php;
       include /etc/nginx/fastcgi.conf;
       fastcgi_pass 127.0.0.1:9000;
       fastcgi_param QUERY_STRING url=$request_uri;   #&$args;
       fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    }

    location ~* \favicon.ico$ {
       access_log off;
       expires 1d;
       add_header Cache-Control public;
    } 
于 2012-08-04T18:53:10.587 に答える