最近在学习yaf,装上yaf后,正常访问路径出错。由于是404,因此肯定是nginx的重写规则问题,在google、百度了以后,看到网上的不少教程说鸟哥的手册写错了。php
if (!-e $request_filename) { rewrite ^/(.*) /index.php/$1 last; } // 把index.php 后面的/ 换成 ? 变成以下: if (!-e $request_filename) { rewrite ^/(.*) /index.php?$1 last; }
尝试以后发现能够,由于公司用的重写规则就是 / 而不是 ?,更以为不多是鸟哥文档出错了呀。因此去查找了相关资料。nginx
发现,之因此使用url模式访问的时候,第一种的重写规则并无起做用,也就是说访问的正常路径没有传到index.php(固然这是一种错误的思想,不过开始是这么想的)。接着又去查找资料,发现了tp的一样的重写规则的原理,发现tp是获取$_SERVER['PATH_INFO']这个变量。而后分割,而后去尝试在yaf下var_dump这个变量, NULL,果真出错,猜测或许yaf一样的用了一样的原理。因而搜索为何没有这个变量,和nginx相关联后,发现$_SERVER这个服务器环境变量能够被nginx干预,也就是在nginx处理的时候,会从fastcgi传过来。接着搜索nginx的配置文件,发现了fastcgi的传到server的参数。bash
fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REQUEST_SCHEME $scheme; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200;
而后并无发现PATH_INFO,因此基本上已经接近真相了。服务器
而后去获得的如今的条件去查找,获得了下面的语句:学习
fastcgi_split_path_info ^(.+?\.php)(/.*)$; set $path_info $fastcgi_path_info; fastcgi_param PATH_INFO $path_info; try_files $fastcgi_script_name =404;
构造path_info 并传过去。果真传过去以后,马上就能够了。ui