Total Pageviews

Thursday, 4 April 2013

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

发现原来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;
    }