做项目用到ThinkPHP框架,在Linux+Apache下面是正常的,但是在Linux+Nginx上面运行不出来,网上找了各种办法,才发现是nginx pathinfo默认没有开启和ThinkPHP rewrite的问题,下面是具体的配置,有需要的朋友可以参考下。
服务器环境:LNMP 1.2,php 5.3,mysql 5.6.23,nginx 1.8.0;
我是在/usr/local/nginx/conf/vhost下面新建的虚拟主机,test.abc.com.conf,这个需要在/usr/local/nginx/conf/nginx.conf里面引入,不懂得可以百度下。
下面是配置文件test.abc.com.conf的内容:
server {
listen ;
server_name test.abc.com;
root /home/www/abc; # thinkphp的路径
location / {
index index.php index.html index.htm;
#如果请求既不是一个文件,也不是一个目录,则执行以下重写规则
if (!-e $request_filename)
{
#地址作为将参数rewrite到index.php上。
rewrite ^/(.*)$ /index.php/$1;
}
}
#proxy the php scripts to php-fpm
location ~ \.php {
include fastcgi.conf;
##pathinfo支持start
#定义变量 $path_info ,用于存放pathinfo信息
set $path_info "";
#定义变量 $real_script_name,用于存放真实地址
set $real_script_name $fastcgi_script_name;
#如果地址与引号内的正则表达式匹配
if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
#将文件地址赋值给变量 $real_script_name
set $real_script_name $1;
#将文件地址后的参数赋值给变量 $path_info
set $path_info $2;
}
#配置fastcgi的一些参数
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
###pathinfo支持end
fastcgi_intercept_errors on;
##LNMP pass值这个 原生的是 127.0.0.1:9000
fastcgi_pass unix:/tmp/php-cgi.sock;
}
}
将URL_MODEL的值设置成’2’;
然后重启nginx和php-fpm;
然后就发现页面是出来了,功能没用。。。。
最后在网上找到是因为:当php.ini 的 cgi.fix_pathinfo=0时 PHP_FILE获取的值是.php,导致U函数生成URL不正确;
然后说改为1就好,但是会有安全隐患,我对这个了解不深,希望网友能找到更合适的解决方法,目前 我是在php.ini 把 cgi.fix_pathinfo=0给注释掉了。。。
希望对大家有所帮助,也欢迎大家拍砖吐槽。