如何将具有扩展名的请求路由到CakePHP 2.2.0中的特定Controller操作

时间:2012-07-17 20:09:05

标签: php cakephp routing

我正在使用CakePHP 2.2.0,我需要创建一个获取此类页面的路由:

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未找到错误

我真的不明白原因,正如文件所说:

  

这将告诉路由器删除任何匹配的文件扩展名,并且   然后解析剩下的东西。

所以,这正是我需要的,我必须解释(仅针对此操作),当用户数字/用户/ mypage时调用 mypage 操作。 php(带扩展名)。

我没有添加任何其他内容。 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;
        }
}

我认为问题很清楚,如果请求有扩展名,如何将请求路由到特定的Controller操作?

我需要:

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

2 个答案:

答案 0 :(得分:2)

首先,您使用parseExtensions()或使用connect()将“.php”添加到url模板。你不能同时使用它们。无论你选择什么,我建议做一个实验。尝试使用任何其他扩展,如“php5”,看看它的工作正常。显然你的问题是你的nginx配置:

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

这些行告诉nginx解析url中以.php结尾的任何内容,作为文件系统中的硬文件。这不是很容易克服的。您可以在该指令中使用try_files,其中有一个回退到另一个脚本,这很棘手,或者您只需使用另一个扩展名为您的网址:)

我希望这能让你清楚地了解你必须做的事情。

答案 1 :(得分: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;
    }