1

我正在使用 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 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() 将“.php”添加到 url 模板。您不能同时使用两者。无论您选择什么,我都建议您进行实验。尝试使用任何其他扩展,例如“php5”,看看它是否正常工作。所以很明显你的问题是你的nginx配置:

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

这些行告诉 nginx 将 url 中以 .php 结尾的任何内容解析为文件系统中的硬文件。这不是很容易克服。您可以在该指令中使用 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 回答