我最近一直在研究、使用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配置修改好了,系统运行就正常了。