最近在學習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