我正在使用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()
答案 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;
}