如何在nginx環境中啓用php的pathinfo URL模式[修正]

(到別的地方看到這篇文章,也是我寫的^_^) php

2014年1月6日21:23 發現不加index.php訪問報404錯誤,一番研究後location正則有誤,現已修正nginx

咱們在安裝lnmp一鍵安裝的時候,通常都沒有開啓pathinfo訪問模式 shell

這種模式在比較多的框架中用到,好比國人的ThinkPHP,還好比C寫的Yaf也用到,不支持就比較惋惜了。 網絡

pathinfo的原理就是將index.php/xxxx/xxx相似的網址當作php來執行,而且須要將xxx/xxx寫入到$_SERVER[‘PATH_INFO’]中 框架

這個是lnmp.org(我裝的就是這個,因此我以這個爲例子)開出來的虛擬機的配置中的一段(vhost/***.conf),修改nginx配置文件也是這樣修改 spa

location ~ .*\.(php|php5)?$
	{
		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php-cgi.sock;
		fastcgi_index index.php;
		include fcgi.conf;
	}

你們明顯看到,location中的正則中,寫了一個$,悲劇了,表示就此結束(?表示前面的php只匹配一次,這個只是隨便提提) unix

最終,應該如此處理(location那行也修改了,由於我沒有用到php5處理): code

if (!-e $request_filename)
		{
			rewrite ^\/([^\.]*)$ /index.php/$1 last;
			break;
		}
location ~ \.php
	{
		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php-cgi.sock;
		fastcgi_index index.php;
		include fcgi.conf;
		set $path_info "";
		set $real_script_name $fastcgi_script_name;
		if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
			set $real_script_name $1;
			set $path_info $2;
		}
		fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
		fastcgi_param SCRIPT_NAME $real_script_name;
		fastcgi_param PATH_INFO $path_info;
	}



後面的部分處理我是參考的網絡上搜索到的文檔,我特地帶註釋版告訴你們,這是別人沒有說的 ip

location ~ \.php
	{
		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php-cgi.sock;
		fastcgi_index index.php;
		include fcgi.conf;
		set $path_info "";#初始化一個變量
		set $real_script_name $fastcgi_script_name;#初始化一個變量,而且獲取到一個原始賦值
		if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {#檢測若是.php後面還存在/開始參數,將參數處理
			set $real_script_name $1;#將第一個正則子串匹配到的賦值
			set $path_info $2;#將第二個正則子串匹配到的賦值
		}
		fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;#修改SCRIPT_FILENAME值
		fastcgi_param SCRIPT_NAME $real_script_name;#修改SCRIPT_NAME值
		fastcgi_param PATH_INFO $path_info;#修改PATH_INFO值
		#上述三個賦值都是replace into的模式,這些值都是寫在fcgi.conf中
	}
相關文章
相關標籤/搜索