发现原来nginx并不像apache那样可以直接支持pathinfo,因此百度了一下,找到了启用pathinfo的解决方案。
打开nginx.conf配置文件,找到类似如下代码的地方(不同版本的nginx可能稍有不同,但相差不远):
location ~ \.php$
{
#原有代码
}
将其改成:
#去掉$是为了不匹配行末,即可以匹配.php/,以实现pathinfo
location ~ \.php
{
#原有代码
#定义变量 $path_info
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;
}
这样,nginx服务器就可以支持pathinfo了。
上面做的是让PHP文件能够接收到pathinfo的参数,那么现在剩下要做的就是要将参数rewrite到单一的入口文件index.php上。在网上搜索了一下WordPress在nginx环境下的固定链接配置方式,发现都比较繁琐,于是直接自己写了一段rewrite规则,加在access_log语句的上方即可:
#如果请求不是一个文件,也不是一个目录
if (!-e $request_filename)
{
#地址作为将参数rewrite到index.php上。
rewrite ^/(.*)$ /index.php/$1;
#若是子目录则使用下面这句,将folder改成目录名称即可。
#rewrite ^/folder/(.*)$ /folder/index.php/$1;
}
打开nginx.conf配置文件,找到类似如下代码的地方(不同版本的nginx可能稍有不同,但相差不远):
location ~ \.php$
{
#原有代码
}
将其改成:
#去掉$是为了不匹配行末,即可以匹配.php/,以实现pathinfo
location ~ \.php
{
#原有代码
#定义变量 $path_info
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;
}
这样,nginx服务器就可以支持pathinfo了。
上面做的是让PHP文件能够接收到pathinfo的参数,那么现在剩下要做的就是要将参数rewrite到单一的入口文件index.php上。在网上搜索了一下WordPress在nginx环境下的固定链接配置方式,发现都比较繁琐,于是直接自己写了一段rewrite规则,加在access_log语句的上方即可:
#如果请求不是一个文件,也不是一个目录
if (!-e $request_filename)
{
#地址作为将参数rewrite到index.php上。
rewrite ^/(.*)$ /index.php/$1;
#若是子目录则使用下面这句,将folder改成目录名称即可。
#rewrite ^/folder/(.*)$ /folder/index.php/$1;
}