一、nginx不支持thinkphp的原因


ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,只需要在配置文件中设置 'URL_MODEL' => 2 即可。在Apache下只需要开启mod_rewrite模块就可以正常访问了,但是Nginx中默认是不支持PATHINFO的,所以nginx默认情况下是不支持thinkphp的。不过我们可以通过修改nginx的配置文件来让其支持thinkphp。


二、让nginx支持pathinfo,支持thinkphp


1、打开Nginx的配置文件,注释以下红色字体内容:


http {

  include       mime.types;    #此项不加则无法加载CSS、js页面样式

  server {

        listen       80;

        server_name  localhost;

        root html;

    location / {

          index  index.php index.html index.htm;

#       location ~ .*\.(php|php5)?$

#                    {

#                            fastcgi_pass 127.0.0.1:9000;

#                            fastcgi_index index.php;

#                            include fastcgi.conf;

#                    }

    location /status {

                stub_status on;

                #access_log   off;

                }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

                {

                        expires      30d;

                }

    location ~ .*\.(js|css)?$

                {

                        expires      12h;

                }   

        #access_log off;

      }

include  vhost/*.conf;

}


2、对注释的内容进行重写,绿色字体部分!


http {

  include       mime.types;    #此项不加则无法加载CSS、js页面样式

  server {

        listen       80;

        server_name  localhost;

        root html;

    location / {

           index  index.php index.html index.htm;

        #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则

        if (!-e $request_filename)

          {

             #地址作为将参数rewrite到index.php上。

             rewrite ^/(.*)$ /index.php/$1;

             #若是子目录则使用下面这句,将subdir改成目录名称即可。

             #rewrite ^/subdir/(.*)$ /subdir/index.php/$1;

             }

        }

        #proxy the php scripts to php-fpm

    location ~ \.php {

        include fastcgi.conf;

        ##pathinfo支持start

        #定义变量 $path_info ,用于存放pathinfo信息

        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;

        ###pathinfo支持end

        fastcgi_intercept_errors on;

        fastcgi_pass   127.0.0.1:9000;

           }

   location /status {

                stub_status on;

                #access_log   off;

                }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

                {

                        expires      30d;

                }

    location ~ .*\.(js|css)?$

                {

                        expires      12h;

                }   

        #access_log off;

      }

include  vhost/*.conf;

}