让AMH虚拟主机支持PATHINFO

现在公司许多程序是在基于ThinkPHP框架上进行开发的, 然而基于此框架开发的程序,URL访问形式如下:

http://it.ctwoo.com/index.php/Login/index

默认Nginx是不支持PATHINFO的。

AMH虚拟主机支持PATHINFO更改方法,更改需要支持PATHINFO的主机的配置文件:

1
vi /usr/local/nginx/conf/vhost/domain.com.conf

参考配置:

1
2
3
4
5
6
7
8
9
10
location ~ ^(.+\.php)(.*)$
{
fastcgi_pass unix:/tmp/php-cgi-e-uncommon.com.sock;
fastcgi_index index.php;
//begin
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
//end
include fcgi-host.conf;
}

Esc :wq 保存退出。

进入AMH后台重启Nginx即可。

2014年10月30日补充:
问题1:thinkphp在nginx环境下,不支持pathinfo。

pathinfo模式,举个例子:

http://www.geekpark.net/read/view/171078

首先会访问到 www.geekpark.net/index.php文件

然后 通过php文件get到参数 就会获取到 read/view/171078

通过拆分成数组就是

array(0=>’read’,1=>’view’,2=>171078)

那么系统就会去 include read.php 然后在实例化 read

然后访问read对象内的 view方法

然后 view方法 get到171078这条参数进行数据库查询…..

很简单的理解为

read /view/ 171078

控制器 方法 参数

而thinkphp支持4种模式,将官网的讲解粘贴如下:


一、普通模式:设置URL_MODEL 为0

采用传统的URL参数模式

http://serverName/appName/?m=module&a=action&id=1

二、PATHINFO模式(默认模式):设置URL_MODEL 为1

默认情况使用PATHINFO模式,ThinkPHP内置强大的PATHINFO支持,提供灵活和友好URL支持。PATHINFO模式自动识别模块和操作,例如

http://serverName/appName/module/action/id/1/

或者

http://serverName/appName/module,action,id,1/

在不考虑路由的情况下,第一个参数会被解析成模块名称(如果启用了分组的话,则依次往后递推),第二个参数会被解析成操作,后面的参数是显式传递的,而且必须成对出现,例如:

http://serverName/appName/module/action/year/2008/month/09/day/21/

其中参数之间的分割符号由URL_PATHINFO_DEPR参数设置,默认为”/”,例如我们设置URL_PATHINFO_DEPR为“-”的话,就可以使用下面的URL访问

http://serverName/appName/module-action-id-1/

注意不要使用”:” 和”&”符号进行分割,该符号有特殊用途。

略加修改,就可以展示出富有诗意的URL,呵呵~

如果想要简化URL的形式可以通过路由功能(后面会有描述)以及空模块和空操作。

在PATH_INFO模式下面,会把相关参数转换成GET变量,以及并入REQUEST变量,因此不妨碍URL里面的GET和REQUEST变量获取。

三、REWRITE模式: 设置URL_MODEL 为2

该URL模式和PATHINFO模式功能一样,除了可以不需要在URL里面写入口文件,和可以定义.htaccess
文件外。在开启了Apache的URL_REWRITE模块后,就可以启用REWRITE模式了,具体参考下面的URL重写部分。

四、兼容模式: 设置URL_MODEL 为3

兼容模式是普通模式和PATHINFO模式的结合,并且可以让应用在需要的时候直接切换到PATHINFO模式而不需要更改模板和程序,还可以和URL_WRITE模式整合。兼容模式URL可以支持任何的运行环境。

兼容模式的效果是:

http://serverName/appName/?s=/module/action/id/1/

并且也可以支持参数分割符号的定义,例如在URL_PATHINFO_DEPR为~的情况下,下面的URL有效:

http://serverName/appName/?s=module~action~id~1

其实是利用了VAR_PATHINFO参数,用普通模式的实现模拟了PATHINFO的模式。但是兼容模式并不需要自己传s变量,而是由系统自动完成URL部分。正是由于这个特性,兼容模式可以和PATHINFO模式之间直接切换,而不需更改模板文件里面的URL地址连接。

某些服务器环境不能良好的支持PATHINFO,但是在大多数环境下面ThinkPHP可以进行兼容判断,如果你的服务器环境或者空间仍然无法识别PAHTINFO的话,或者需要自己增加识别方法或者可以选择普通模式或者兼容模式URL运行。


前面AMH(nginx环境)支持pathinfo相关设置有讲到

实际使用发现新版的thinkphp设置后,不能成功。

后来尝试,使用如下方法解决:

1、将thinkphp模式设置为rewrite模式;

2、在AMH下,通过AMRewrite模块,新建一个rewrite规则,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
location /Apps/crm7/ {
if (!-e $request_filename) {
rewrite ^/Apps/crm7/(.*)$ /Apps/crm7/index.php?s=$1 last;
break;
}
}
location /Apps/zhiansys/ {
if (!-e $request_filename) {
rewrite ^/Apps/zhiansys/(.*)$ /Apps/zhiansys/index.php?s=$1 last;
break;
}
}
location /Apps/it/ {
if (!-e $request_filename) {
rewrite ^/Apps/it/(.*)$ /Apps/it/index.php?s=$1 last;
break;
}
}

3、将规则应用到对应网址,重启nginx。

问题2:AMH环境下访问sqlserver数据库,返回数据编码有误,导致返回数据均为问号

首先,AMH环境下安装mssql模块:

1、安装freetds

1
2
3
4
5
6
cd /usr/local/
wget http://mirrors.xmu.edu.cn/ubuntu/archive/pool/main/f/freetds/freetds_0.82.orig.tar.gz
tar zxf freetds_0.82.orig.tar.gz
cd freetds-0.82
./configure –prefix=/usr/local/freetds –with-tdsver=8.0 –enable-msdblib –enable-dbmfix –with-gnu-ld –enable-shared –enable-static
make && make install

2、下载php源码,安装mssql模块

1
2
3
4
5
6
cd php-5.3.27/ext/mssql
/usr/local/php/bin/phpize;
./configure –with-php-config=/usr/local/php/bin/php-config –with-mssql=/usr/local/freetds
make && make install
vi /etc/php.ini
extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/mssql.so

3、重启面板php、虚拟主机php

1
2
amh php restart amh-web y
amh php restart

其次,修改php.ini

添加mssql.charset = “UTF8″