2011-11-25 59 views
1

當nginx設置的PATH_INFO爲空字符串時,我在從PHP訪問它時遇到一些垃圾字符。nginx中PATH_INFO的空值返回垃圾值

我這是怎麼設置的nginx的PATH_INFO:

fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 

它工作正常,如果路徑信息具有一定的非空值。我甚至重新安裝了nginx,但它沒有幫助。 nginx的版本是1.0.5(我使用的是Ubuntu 11.10,如果有的話)。

+0

請給一個路徑,它產生的價值的一個例子。 – DaveRandom

+1

當url類似'http:// localhost/myapp/index.php'時,PATH_INFO應該是空的,但會返回垃圾。當它是'http:// localhost/myapp/index.php/testing'時,PATH_INFO是「/ testing」。 – viky

+0

當你說它返回垃圾時,你能舉出這個垃圾的例子嗎? – DaveRandom

回答

1

我得到了同樣的事情,一個視圖天前..所以我改變了正則表達式看起來像這樣:

fastcgi_split_path_info ^(.+\.php)(/.*)$; 

,並添加了查看其他線路,使工作最有可能的Apache。

這裏是整個DIFF我對我所做的文件fastcgi_params

@@ -3,13 +3,22 @@ 
fastcgi_param CONTENT_TYPE  $content_type; 
fastcgi_param CONTENT_LENGTH  $content_length; 

-fastcgi_param SCRIPT_FILENAME  $request_filename; 
+#fastcgi_param SCRIPT_FILENAME  $request_filename; 
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_split_path_info ^(.+\.php)(/.*)$; 
+fastcgi_param PATH_INFO  $fastcgi_path_info; 
+set  $path_translated ""; 
+if ($fastcgi_path_info) { 
+ set  $path_translated $document_root$fastcgi_path_info; 
+} 
+fastcgi_param PATH_TRANSLATED  $path_translated; 
+fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name; 
+ 
fastcgi_param GATEWAY_INTERFACE CGI/1.1; 
fastcgi_param SERVER_SOFTWARE  nginx/$nginx_version; 

使用這個配置,你總是有PATH_INFO變量,而不是它是如何在做F.E. Apache的。

一些我用剛剛籤這樣的腳本是什麼(當然)不與我的配置工作:

if (!isset($_SERVER['PATH_INFO']) { doSomething() } 

我勸主開發商把它改成這樣:

if (!isset($_SERVER['PATH_INFO'] || empty($_SERVER['PATH_INFO']) { doSomething() } 

如果你想看看我的IM全服務器的配置,只需要在這個GitHub上的倉庫一看: https://github.com/SimonSimCity/webserver-configuration/

編輯:我發現一個稍微不同的解決方案的博客。我沒有測試它,但它似乎有點小;) http://www.jzxue.com/fuwuqi/http-iis-apache/201108/19-8538.html

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 /var/html/$real_script_name; 
fastcgi_param SCRIPT_NAME $real_script_name; 
fastcgi_param PATH_INFO $path_info;