nginx配置pathinfo支持,最佳方案
〇. 前言
pathinfo有兩個,1 pathinfo()函數,2 $_SERVER['PATH_INFO']。
pathinfo()是php的庫函數,原生支持不需要nginx配置,$_SERVER['PATH_INFO']才需要nginx的特殊配置。
為什么要配置pathinfo,因為ThinkPHP/CodeIgniter/Yii等MVC框架都需要$_SERVER['PATH_INFO']。
一. 配置pathinfo支持之前,先讓nginx支持PHP
這里有個缺陷,就是得到的SCRIPT_NAME不準確。
二. 開始配置 pathinfo
這是傳統的nginx - pathinfo 解決方案
三. 尋找最佳方案的途中
因為配置文件里面PATH_INFO 跟 SCRIPT_NAME 都是使用了 $fastcgi_script_name,所以strace追蹤nginx進程發現兩者一樣是正常的。可是從瀏覽器請求的效果看到PATH_INFO跟SCRIPT_NAME卻不一樣,雖然從最終結果看,它符合我們的要求,可是不合理呀。
我猜想,是php-fpm或者說fastcgi對此做了一些容錯處理。
四. 最佳方案
五. rewrite 隱藏index.php
另外,現在nginx官方推薦使用try_files取代rewrite,不過try_files好像不支持正則,有興趣的童鞋自行研究哈。給出一個例子,如下
六. 附件
1) 上面用到的配置文件的合集
1 server {
2 listen 80;
3 server_name test;
4 charset utf-8;
5
6 index index.html index.htm index.php;
7 root /var/www/test;
8
9 # rewrite 隱藏index.php
10 location / {
11 if (!-e $request_filename){
12 rewrite ^/(.*)$ /index.php/$1 last;
13 break;
14 }
15 }
16
17 # 傳統方案
18 #location ~ .php {
19 # set $real_script_name $path_info;
20 #
21 # if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {
22 # set $real_script_name $1;
23 # set $path_info $2;
24 # }
25 #
26 # include fastcgi_params;
27 # fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
28 # fastcgi_param PATH_INFO $path_info;
29 # fastcgi_param SCRIPT_NAME $real_script_name;
30 #
31 # fastcgi_pass 127.0.0.1:9000;
32 #}
33
34 # 尋找最佳方案的途中
35 #location ~ .php {
36 # include fastcgi.conf;
37 # fastcgi_param PATH_INFO $fastcgi_script_name;
38 #
39 # fastcgi_pass 127.0.0.1:9000;
40 #}
41
42 # 最佳方案
43 location ~ .php {
44 fastcgi_split_path_info ^(.+.php)(/.+)$;
45
46 include fastcgi.conf;
47 fastcgi_param PATH_INFO $fastcgi_path_info;
48
49 fastcgi_pass 127.0.0.1:9000;
50 }
51
52 }
2) fastcgi.conf 的中文注釋
1 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #腳本文件請求的路徑 2 fastcgi_param QUERY_STRING $query_string; #請求的參數;如?app=123 3 fastcgi_param REQUEST_METHOD $request_method; #請求的動作(GET,POST) 4 fastcgi_param CONTENT_TYPE $content_type; #請求頭中的Content-Type字段 5 fastcgi_param CONTENT_LENGTH $content_length; #請求頭中的Content-length字段。 6 7 fastcgi_param SCRIPT_NAME $fastcgi_script_name; #腳本名稱 8 fastcgi_param REQUEST_URI $request_uri; #請求的地址 9 fastcgi_param DOCUMENT_URI $document_uri; #與$uri相同。 10 fastcgi_param DOCUMENT_ROOT $document_root; #網站的根目錄。在server配置中root指令中指定的值 11 fastcgi_param SERVER_PROTOCOL $server_protocol; #請求使用的協議,通常是HTTP/1.0或HTTP/1.1。 12 13 fastcgi_param GATEWAY_INTERFACE CGI/1.1; #cgi 版本 14 fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #nginx 版本號,可修改、隱藏 15 16 fastcgi_param REMOTE_ADDR $remote_addr; #客戶端IP 17 fastcgi_param REMOTE_PORT $remote_port; #客戶端端口 18 fastcgi_param SERVER_ADDR $server_addr; #服務器IP地址 19 fastcgi_param SERVER_PORT $server_port; #服務器端口 20 fastcgi_param SERVER_NAME $server_name; #服務器名,域名在server配置中指定的server_name 21 22 # PHP only, required if PHP was built with --enable-force-cgi-redirect 23 fastcgi_param REDIRECT_STATUS 200; 24 25 在php可打印出上面的服務環境變量 26 如:echo $_SERVER['REMOTE_ADDR']
3)nginx 的uri、request_uri 區別
$request_uri: /stat.php/qw/cv?id=1585378&web_id=1585378
$uri /stat.php/qw/cv
$document_uri: /stat.php/qw/cv
3) 檢驗REQUEST_URI /DOCUMENT_URI /PHP_SELF /PATH_INFO
echo 'REQUEST_URI - '.$_SERVER['REQUEST_URI'];
echo '<br />DOCUMENT_URI - '.$_SERVER['DOCUMENT_URI'];
echo '<br />SCRIPT_NAME - '.$_SERVER['SCRIPT_NAME'];
echo '<br />PHP_SELF - '.$_SERVER['PHP_SELF'];
echo '<br />PATH_INFO - '.$_SERVER['PATH_INFO'];
同時strace 追蹤nginx進程
總結
以上是生活随笔為你收集整理的nginx配置pathinfo支持,最佳方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vector中insert的用法
- 下一篇: UBUNTU 10.04上安装和使用HA