我最近一直在研究、使用Phalcon PHP开发框架做一个应用,里面的细节问题还真是很多。这就碰见一个URL重写、路由设置失效的事情。
这个故障是这样:配置好测试系统后,无论怎么设置网站系统的路由(Router)系统,都不能引起分配器(dispatcher)的调用,总是调用默认的Index Controller和indexAction。
仔细检查了下代码,没问题。然后又拿出老办法 – 追踪源代码。找到对应的源代码分配器部分,看了看,也没啥可疑的错误。然后检索了一下谷歌,查到了线索。问题出在Nginx的配置上,重写规则不小心写错了。
官方文档:https://docs.phalconphp.com/en/latest/reference/nginx.html 提到:
有两个获取url信息的模式:
Using $_GET[‘_url’] as source of URIs:
里面的重写规则要写成:
location / { try_files $uri $uri/ /index.php?_url=$uri&$args; }
这个模式是Phalcon框架默认的使用规则。
Using $_SERVER[‘REQUEST_URI’] as source of URIs:
重写规则要写成:
location / { try_files $uri $uri/ /index.php; }
如果使用这个模式,需要修改Router的代码:
$router->setUriSource(Router::URI_SOURCE_SERVER_REQUEST_URI);
这里面有提到:
https://forum.phalconphp.com/discussion/11385/how-to-get-get-from-uri
对try_files指令的解析:
这个指令功能是这样,在收到访问请求的时候,先测试$uri是不是文件,再测试是不是目录,如果是继续访问,如果不是,则调用内部的重定向指令。
/index.php?_url=$uri&$args;
这就是Web framework的统一入口操作,所有的请求都导引到指定的地址。就如同一个app一样的,启动都从规定的地方 – index.php 开始。
_url是这个框架内部使用的变量,必须设置的。&$args是传输后面的参数信息。这样,在后面的配置指令里面,url请求就分解了。
fastcgi_split_path_info ^(.+\.php)(/.+)$;
可以检查一下router.zep文件:
其实Phalcon文档里面也提到了,是使用“$_GET[‘_url’] ”进行操作。
其它web框架,使用了其它的变量名,就必须根据要求修改,不能使用”_url”,否则得不到信息。
这里提到了:
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
“Front Controller Pattern” designs are popular and are used on the many of the most popular PHP software packages; But a lot of examples are more complex than they need to be. For Drupal, Joomla, etc., just use this:
try_files $uri $uri/ /index.php?q=$uri&$args;
Note – the parameter names are different based on the package you’re using. For example:
- “q” is the parameter used by Drupal, Joomla, WordPress
- “page” is used by CMS Made Simple
Some software don’t even need the query string and can read from REQUEST_URI. For example, WordPress supports this:
try_files $uri $uri/ /index.php;
If you don’t care about checking for the existence of directories, you can skip it by removing $uri/
.
Nginx配置修改好了,系统运行就正常了。