最近有个新项目要用 yaf 框架,在 Windows 上将 yaf 框架代码部署好之后。想增加一个模块调试一下,但是添加完 module 之后,访问路由死活不会到新的 module 下,一直访问的是默认的 index 模块。网上查了半天,最终在官方的文档下找到了思路。是 Nginx 不支持 PATH_INFO 的问题,就是说,默认的 Nginx 配置,在 PHP 的环境变量
如图所示:
重点是将
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 配置的正则匹配也是有很多的细节,等随后再研究。