1. 程式人生 > >解決nginx+php二級頁面顯示空白的問題

解決nginx+php二級頁面顯示空白的問題

was 遷移 rec 空白 執行 query 文件處理 spa 無法

遷移官網商城的發現主頁的二級界面顯示空白頁,此https商城網站

後修改nginx配置,顯示正常

添加

location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;


fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

這個配置的意思是 在瀏覽器中訪問的.php文件,實際讀取的是 $document_root(網站根目錄)下的.php文件 -- 也就是說當訪問127.0.0.1/index.php的時候,需要讀取網站根目錄下面的index.php文件,如果沒有配置這一配置項時,nginx不回去網站根目錄下訪問.php文件,所以返回空白

nginx+php四個常見、重要的配置項

fastcgi_pass

作用:nginx本身不處理php請求,配置文件中將.php結尾的請求通過FashCGI交給PHP-FPM處理,PHP-FPM是PHP的一個FastCGI管理器

作用域:location, if in location

設置FastCGI服務,其值可以是一個域名、IP地址:端口、或者是一個Unix的Socket文件。

Nginx連接fastcgi的方式有2種:TCP和unix domain socket

TCP是使用TCP端口連接127.0.0.1:9000

Socket是使用unix domain socket連接套接字/dev/shm/php-cgi.sock(很多教程使用路徑/tmp,而路徑/dev/shm是個tmpfs,速度比磁盤快得多)

# TCP形式傳遞
fastcgi_pass localhost:9000;

# Socket形式傳遞
fastcgi_pass unix:/tmp/fastcgi.socket;

# 傳遞給集群
upstream cloud {
    server cgi_1.cloud.com;
    server cgi_2.cloud.com;
}
fastcgi_pass cloud;

 

fastcgi_param

作用域:http, server, location

設置一個傳遞給FastCGI服務的參數,可以是文本或者是變量。

# 例如在接入層Nginx上面傳遞如下5個參數
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;

# 那麽在FastCGI上面,例如PHP-CGI上面就可以通過$_SERVER這個超全局變量獲取。
$_SERVER[‘REMOTE_ADDR‘]
$_SERVER[‘REMOTE_PORT‘]
$_SERVER[‘SERVER_ADDR‘]
$_SERVER[‘SERVER_PORT‘]
$_SERVER[‘SERVER_NAME‘]
  

fastcgi_param 文件詳解
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#腳本文件請求的路徑,也就是說當訪問127.0.0.1/index.php的時候,需要讀取網站根目錄下面的index.php文件,如果沒有配置這一配置項時,nginx不回去網站根目錄下訪問.php文件,所以返回空白
fastcgi_param QUERY_STRING $query_string;                        #請求的參數;如?app=123
fastcgi_param REQUEST_METHOD $request_method;                    #請求的動作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type;                        #請求頭中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length;                    #請求頭中的Content-length字段。

fastcgi_param SCRIPT_NAME $fastcgi_script_name;                  #腳本名稱 
fastcgi_param REQUEST_URI $request_uri;                          #請求的地址不帶參數
fastcgi_param DOCUMENT_URI $document_uri;                        #與$uri相同。 
fastcgi_param DOCUMENT_ROOT $document_root;                      #網站的根目錄。在server配置中root指令中指定的值 
fastcgi_param SERVER_PROTOCOL $server_protocol;                  #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。

fastcgi_param GATEWAY_INTERFACE CGI/1.1;                         #cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;              #nginx 版本號,可修改、隱藏

fastcgi_param REMOTE_ADDR $remote_addr;                          #客戶端IP
fastcgi_param REMOTE_PORT $remote_port;                          #客戶端端口
fastcgi_param SERVER_ADDR $server_addr;                          #服務器IP地址
fastcgi_param SERVER_PORT $server_port;                          #服務器端口
fastcgi_param SERVER_NAME $server_name;                          #服務器名,域名在server配置中指定的server_name

fastcgi_param PATH_INFO $path_info;                             #可自定義變量

-- PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200; 

fastcgi_index

作用域:http, server, location

當請求以/結尾的時候,會將請求傳遞給所設置的index.php文件處理。

fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;

fastcgi_split_path_info

作用域:location

Nginx默認獲取不到PATH_INFO的值,得通過fastcgi_split_path_info指定定義的正則表達式來給$fastcgi_path_info賦值。

目的:讓php能夠解析類似這樣的url http://www.xxx.com/index.php/abc/def
在默認情況下我們打開這個url時會出現無法找到該頁。這就需要在nginx做path_info設置了。
原理:把index.php做為php執行的腳本,把/abc/def做為參數傳給php-cgi執行。
實現:nginx版本0.7.31以上支持fastcgi_split_path_info,這個指令可以設置SCRIPT_FILENAME和PATH_INFO的變量,用正則表達式將這兩部分分開.
例子:我們在nginx配置文件"local"區塊中加入以下代碼。

location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

重啟nginx服務
/usr/local/nginx/sbin/nginx -s reload


 當nginx處理http://www.xxx.com/index.php/abc/def請求時,將會把"index.php"做為php的腳本,/abc/def做為index.php腳本的參數提交給php-cgi執行。

 

  

解決nginx+php二級頁面顯示空白的問題