PathInfo模式,thinkPHP模板与控制之间的关系

pathinfo,一种伪静态的用法,路由模式,即路径:http://blog.csdn.net/bjash/article/details/8466789 而普通模式则是:http://blog.csdn.net/控制器/方法?a=details&m=8466789,就是根据路径内容转成数组,再用数组分析给整个php框架,做伪静态路径也比较常见

1.让 Apache 支持 PathInfo

配置的 Apache 版本 : 2.2.13

在配置文件中加入

<Files *.php>

AcceptPathInfo On

</Files>

这样 Apache 就可以支持针对 php 文件的 PathInfo 了.

2、pathinfo 模式 需要 php.ini 开启下面这个参数

cgi.fix_pathinfo=1

path_info模式:http://www.xxx.com/index.php/模块/方法

而且nginx 环境下,如果 uri 含中文,PATH_INFO就被截断了,会新产生一个 ORIG_PATH_INFO,才是正确的,

3.让 Nginx 支持 PathInfo

在配置文件里添加

location ~ .php

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

set $path_info “”;

set $real_script_name $fastcgi_script_name;

if ($fastcgi_script_name ~ “^(.+?.php)(/.+)$”) {

set $real_script_name $1;

set $path_info $2;

}

fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;

fastcgi_param SCRIPT_NAME $real_script_name;

fastcgi_param PATH_INFO $path_info;

include conf/fcgi.conf;

}

thinkPHP中pathinfo四种访问模式
0:普通模式。http://bbs.aaa.net/index.php?m=user&a=d
m代表模块a代表方法
1:叫pathinfo模式,它下面还分两种模式。默认访问模式是http://bbs.aaa.net/index.php/user/index
2:rewrite重写(伪静态)。可以自己写相关的rewrite规则,也可以使用系统为我们提供的rewrite规则。http://bbs.aaa.net/user/index。
apache手册中有一块是URL重写规则,可以看一下。
3:叫做兼容模式。它的路径访问http://bbs.aaa.net/index.php?s=/user/g
    当服务器上不支持pathinfo模式的时候,但之前的路径访问模式上面,全都用的pathinfo模式,它会提示路径模式不正确。这时,为解决这种问题,可以用标号为3的兼容模式来处理,这些都是支持GET的,所以用兼容模式可以解决它。
设置访问模式,要在conf.php文件内:
    ‘URL_MODEL’=> 0;
    设置为2时,因为开启URL重写,不论是重写的还是被重写的,都能通过原有路径来进行访问。
    如果要开启rewrite模式的话,1、要确认你的服务器已经开启了apache的rewrite模块。apache下的httpd.conf文件中的LoadModule rewrite..这一行的#去掉,然后重启服务器。2、在与主入口文件,项目入口文件同级的目录下面新建一个.htaccess文件。记事本用vi打开,再另存为.htaccess文件。或者是直接打开记事本,在另存为的文件名中写“.htaccess”一定要有引号。建好后可以直接把手册中的rewrite部分粘过来,就可以启用rewrite了,也就是可以直接使用http://bbs.aaa.net/user/index了,不用写index.php或admin.php这些入口文件了。
    如果使用2 rewrite模式,会加大服务器的性能消耗。
    -------
    conf.php中设置
    'PATHINFO_URL_MODEL'=>1普通模式http://.../index.php/m/user/a/index加上m和a,即使把m和a的位置换一下也不影响结果a/index/m/user
    
    普通模式必须要在前面加上/a/模块/a/动作,并且顺序可以发生变化,如果要用GET传值 ,在这种PATHINFO模式下,要加斜线后面再加值,如:http:../index.php/m/user/a/index/username/zhangsan
    
    2、智能模式,值为2
    pathinfo默认就是智能模式,/index.php/user/index意思就是user模块下的index方法
    这种方式下GET传值 :/username/张三
    它的值传方法与普通模式传值一致
    -----------
    ‘URL_PATHINFO_DERP’='-';
    这个设置是把分隔符变为中橫线(-),默认是/
    ------
    改定界符
    'APP_DEBUG'=>'true'开启调试模式,一旦开启,它会模拟linux操作系统来帮我们识别大小写。并且开启之后方法名的大小写与,模板文件的大小写有关。但模拟出来的文件夹命名,不区分大小写。
    
    ---
    默认情况下每个方法下面的$this->display()是显示跟这个方法名相同的模板的,如果不想显示这个方法名的模板,而想显示另一个文件(同级)内容,直接写$this->display('anthor');就会用anthor.html,括号里不用写后缀名
    
    跨模块显示(以下示例的$this->display均在Index模块下的index方法中)
    $this->display('模块名:模板名');如$this->display('user:index');就会显示user模块下的index文件
    
    跨主题,也叫跨皮肤
    在default建一个skin,在skin下建一个user文件夹,再在它下面建一个new.html
    $this->display('skin@user:new');那这样的话,再显示这个页面的时候会红色背景
    (‘皮肤的目录名@找哪个目录的名称:模板的名称’);
    ---
    全路径输出:
    在主入口文件下,建一个Public目录,在它下建一个ss.html,在它下面再加一个背景颜色
    $this->display('./Public/ss.html');再打开这个页面就是绿色背景
    注:加载文件的位置全以主入口文件定位。即相对于index.php这个文件定位的。
   ----
    还有种绝对路径,按你的磁盘来写('E:/AppServ/www/project/Public/ss.html');效果一样
    ---
    $this->display('指定位置',‘编码’,‘文件的mimie类型’);比如需要输出xml文件,就可以写成$this->display('index','utf-8','text/xml');

原文地址:https://www.cnblogs.com/j-king/p/3657238.html