最近在将公司的一台的服务器从Apache迁移到Nginx的时候出了点问题,特做个笔记。 问题出在上面的一个网站是基于ThinkPHP框架开发的,用默认的方法配置不行。在网上baidu之后发现这个问题很普遍,通用解决方法的配置如下: server { ... if (!-e $request_filename) { rewrite ^/(.*)$ /index.php/$1 last; break; }
}
location ~ .+\.php($|/) { .... set $script $uri; set $path_info "/"; if ($uri ~ "^(.+\.php)(/.*)") { set $script $1; set $path_info $2; }
fastcgi_param PATH_INFO $path_info; fastcgi_param SCRIPT_FILENAME /path/to/web-root$script;
}
昨天在看书的时候突然发现,原来fastcgi模块自带了一个指令专门用来解决此类问题的,该指令是fastcgi_split_path_info ,该指令会根据给定的正则表达式来分隔URL,从而提取出脚本名和path info信息,使用这个指令可以避免使用if语句,配置更简单。(server部分的if语句可以用try_files来代替),新的配置如下: server { ... try_files $uri /index.php$uri; }
location ~ .+\.php($|/) { .... fastcgi_split_path_info ^(.+\.php)(/.*)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME /path/to/web-root$fastcgi_script_name;
}