解決nginx+php二級頁面顯示空白的問題
遷移官網商城的發現主頁的二級界面顯示空白頁,此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二級頁面顯示空白的問題