最近有个新项目要用yaf框架,在Windows上将yaf框架代码部署好之后。想增加一个模块调试一下,但是添加完module之后,访问路由死活不会到新的module下,一直访问的是默认的index模块。网上查了半天,最终在官方的文档下找到了思路。是Nginx不支持PATH_INFO的问题,就是说,默认的Nginx配置,在PHP的环境变量$_SERVER下的$_SERVER[‘PATH_INFO’]是个空字符串,导致yaf路由不到新的模块下。
如图所示:
重点是将$_GET的path_info参数赋值给$_SERVER,因为yaf中是根据这个来判断路由到哪个模块的。当然前提是得通过重写给get的path_info赋值
rewrite ^/(.*)$ /index.php?_path_info=/$1 last;
我试了下,这样确实好使。而且,如果你直接在代码中给$_SERVER[‘PATH_INFO’]赋值null,也是好使的。(这个可能得看下yaf底层是怎么去匹配这个路由了)
但是这样直接在代码中写死这个实在是太不“优雅”了。
又是一番百度之后,终于在yaf的官方文档中,看到了Nginx的重写规则。按照官方文档配置好之后,就可以正常访问新添加的模块了。
3.2. Hello World (laruence.com)
最后,得出结论就是:出现问题先去找官方文档查看,不要直接去百度想着找现成的答案,这样太容易走弯路。
这次的问题就是先在官方的文档下,找到是path_info的问题这个关键点,然后又去查找Nginx匹配规则问题。最终也是在官方的文档中找到解决方法。
尤其是开源的项目,网上其他人遇到的问题,并不一定是完全适用你的,要搞清楚自己的问题是什么,出现错误的原因是什么,然后再对症下药。
网上好多的关于Nginx的配置,都是针对thinkPHP的路由的修改,并不适用于Windows下yaf+Nginx的模式。
最后贴一下,我的最终的Nginx配置,也顺便记录下Nginx配置相关的信息
server { listen 208; server_name localhost; root "D:/yaf/yaf_test_hupc"; access_log logs/yaf/access_log.log; error_log logs/yaf/error_log.log; if (!-e $request_filename) { rewrite ^/(.*) /index.php/$1 last; } location / { index index.php index.html; try_files $uri $uri/ /index.php$is_args$query_string; } location ~ .php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } }
Nginx配置主要是对访问路由做规则匹配或重写,然后根据规则匹配分发到php-cgi。还有日志文件的规定,这个日志文件是基于当前Nginx所在目录来的。Nginx配置的正则匹配也是有很多的细节,等随后再研究。