在nginx中配置pathinfo模式支持thinkphp的URL重写 缺少PHP_SELF的临时解决办法

2016-02-28 11:21:00
hainuo
原创 2064
摘要:在nginx中配置pathinfo模式支持thinkphp的URL重写 缺少PHP_SELF的临时解决办法
当使用thinkphp时,如果你的服务器使用的是nginx可能会遇到写意想不到的问题。问题产生的原因在于thinkphp核心代码`Thinkphp/Thinkphp.class.php`中的第81行```if(!IS_CLI) { // 当前文件名 if(!defined('_PHP_FILE_')) { if(IS_CGI) { //CGI/FASTCGI模式下 $_temp = explode('.php',$_SERVER['PHP_SELF']);//就是这一行啊 别看错了 define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/')); }else { define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'],'/')); } } if(!defined('__ROOT__')) { $_root = rtrim(dirname(_PHP_FILE_),'/'); define('__ROOT__', (($_root=='/' || $_root=='\\')?'':$_root)); }}```nginx通过配置pathinfo方式支持thinkphp后但是不巧,`$_SERVER`数组缺少一个关键的赋值`$_SERVER["PHP_SELF"]`,这个变量的值为空。显然nginx不会给php引擎传递`PHP_SELF`值不能奖这个坑扔给thinkphp或者php引擎或者nginx,但是他们三个应该好好思量如何解决这个问题。我的nginx的配置如下```server {listen 80;server_name www.hainuo.info;access_log /data/wwwlogs/www.hainuo.info_nginx.log combined;index index.html index.htm index.php;include /usr/local/nginx/conf/osv2_nginx.conf;root /data/wwwroot/www.hainuo.info;location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ { valid_referers none blocked *.hainuo.info www.hainuo.info; if ($invalid_referer) { #rewrite ^/ http://www.linuxeye.com/403.html; return 403; } }location ~ \.php { #fastcgi_pass remote_php_ip:9000; fastcgi_pass unix:/dev/shm/php-cgi.sock; fastcgi_index index.php; include fastcgi_params; set $real_script_name $fastcgi_script_name; if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") { set $real_script_name $1; set $path_info $2; } fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; fastcgi_param SCRIPT_NAME $real_script_name;# 尝试手动赋值 PHP_SELF 失败 # fastcgi_param PHP_SELF $real_script_name; fastcgi_param PATH_INFO $path_info; }location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ { expires 30d; access_log off; }location ~ .*\.(js|css)?$ { expires 7d; access_log off; }}```临时解决办法在需要的脚本中使用`$_SERVER['PHP_SELF']=$_SERVER['SCRIPT_NAME'];`这个场景在opensns的安装时,被我遇到,解决办法是在install.php加上上述代码。应该说只要默认脚本名称与当前脚本名称不想同,且使用`bind_model`方式的都会出现这种情况
发表评论
柒 乘 陆 =
评论通过审核后显示。