nginx下实现pathinfo及WordPress、Typecho永久链接(伪静态)

蓝飞 蓝飞 | 时间:2012-10-18, Thu | 17,273 views
后台技术 

今晚配置了下LNMP环境下的阿里云服务器,将网站(使用的是自己写的BasePHP Beta框架)部署完毕后发现伪静态功能未能启用,才发现原来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了。

2013年11月10日补充

nginx 0.7及以上已支持pathinfo,不需要模拟实现,但注意

location ~ .*\.php$

应该改成:

location ~ .*\.php(\/.*)*$

才能够匹配到含有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;
}
如需转载请注明出处:蓝飞技术部落格

8 条评论 »

  1. 博主有才,这样就不用再麻烦到处设置伪静态了。

    1. 呵呵,过奖过奖,个人观点与大家分享而已= =。。

  2. 学习了博主, 都是干活···

  3. 学习伪静态设置

  4. Era Era

    我想在WordPress的根目录下新建一个子目录放置typecho,也是按你这样的设置吗?

  5. 圆圆 圆圆

    我像这样改过配置文件后 phpmyadmin就登陆不上了 有什么办法让两个都能用吗?

  6. 博主朋友 能不能换个友链 我的博客www.14jz.com