欢迎访问分类目录网
快审联系QQ:158925126当前位置:分类目录网 » 站长资讯 » 技术教程 » 文章详细 订阅RssFeed

ThinkPHP框架的网站url重写nginx规则

来源:本站原创 浏览:957次 时间:2017-06-08

nginx下的基于thinkphp的应用的url重写,需了解thinkphp的各种url格式参数的处理逻辑以及nginx重写的原理。简单点说,无论哪种url格式,nginx都需要执行ThinkPHP下的应用单一入口文件,然后将各种url格式按照一定的格式规则进行进行参数化处理,最终执行指定模块与控制器;这个过程用户是看不到的,用户只能看到各种规则的url,这些url的规则如下:


#第一种 普通get多参数方式
htt://www.jb100.net/index.php?m=Info&a=usrInfo

#第二种 pathinfo方式
htt://www.jb100.net/index.php/Info/usrInfo
#带有get的其他变量
htt://www.jb100.net/index.php/Info/usrInfo/Id/1
#第三种 普通get单参数方式 ThinkPHP中又称”兼容模式“
htt://www.jb100.net/index.php?s=Info/usrInfo
#带有get的其他变量
htt://www.jb100.net/index.php?s=Info/usrInfo/Id/1

/*
#当然这三种模式还可以附带文件后缀
#其实合并起来也就3种
#附带后缀只是上述三种规则的细微变化
#TinkPHP框架核心代码获取到以上三种模式的参数后
#会进行特定的处理 带不带后缀 带哪种后缀 均可配置

#也就是如下几种规则


#第一种
htt://www.jb100.net/index.php/Info/usrInfo.html
#第二种
htt://www.jb100.net/index.php?s=Info/usrInfo.html

什么是pathinfo?pathinfo是php的功能,nginx并没有pathinfo功能,在php中书写如下代码

<?php


print_r(pathinfo('http://www.jb100.net/test/index.txt'));

?>

结果:


Array
(
 [dirname] => http://www.jb100.net/test
 [basename] => index.txt
 [extension] => txt
 [filename] => index
)


通过以上运行结果,可以看到打印出来的数组key字段已经很明显的标示出其意义来了。

ThinkPHP就采用了这种思想,将单一入口的url传参格式化,典型的基于ThinKPHP的url示例如下:

http://www.jb100.net/index.php/Usr/UsrInfo

复制代码

简单点理解,上述格式化的url形式就是ThinkPHP需要支持的pathinfo路径模式。对这个种格式化的url进行稍微解释,访问这个么一个地址,对基于ThinkPHP框架的网站来说,实际需要执行的就是网站根目录下的index.php文件,而该url中后面的/Usr/UsrInfo则被作为mvc思路中的功能模块参数与控制器参数,转换为普通get方式传参则上述url就要变为:

http://www.jb100.net/index.php?m=Usr&a=UsrInfo

复制代码
当然,get参数的变量该例子中一个是m一个是a,这个变量名在ThinkPHP中是可以改变的,这就需要依据具体的基于ThinkPHP的应用的模块规划与喜好了。

有了这种思路,nginx的url重写就有了最原始的写法了,对于上述pathinfo的格式化url,nginx在不做url重写时会把它当做一个路径来执行,一般来说没有谁会吃多了撑得在网站根目录下建立一个名字叫index.php的目录(注意:是目录,不是一般意义上的文件),所以第一种url重写出现了:

#一下是nginx配置文件的代码片段 仅书写url重写的部分

location / {
 root /var/www;
 index index.html index.htm index.php;
 if (!-d $request_filename) {
 rewrite ^/(.*)/(.*)/*$  /index.php?m=$1&a=$2  last;
 break;
 }
}

但问题出现了,基于ThinkPHP的应用不仅仅只有上述例子中的这种pathinfo模式,现在变成这样的了:(为了便于解说,称如下代码段为“url示例”,后方提到“url示例”就是指此处的三种url格式)


#第一种,未隐藏index.php 但url路径中有.html后缀

http://www.jb100.net/index.php/Usr/UsrInfo.html

#第二种,隐藏脚本文件index.php

http://www.jb100.net/Usr/UsrInfo


http://www.jb100.net/Usr/UsrInfo/

复制代码

#第三种,需要在访客看到的网址中隐藏掉index.php,且带.html后缀

http://www.jb100.net/Usr/UsrInfo.html

复制代码
再了解下ThinkPHP中处理url的各种逻辑,ThinkPHP对传参进行了多种判定与处理,除了get方式传递不同的get变量作为mvc中的控制变量外,还有一个“兼容模式”的传参规则,也就是如下:

#ThinkPHP可以处理的传参形式

http://www.jb100.net/index.php?s=/Usr/UsrInfo

复制代码
这种传参形式依然是get方式传参,但省略了多个get参数。ThinkPHP框架会对获取到的get变量$_GET['s']进行处理,从其中提取出mvc所需要的各个控制变量。

所以又一种nginx的url重写出现了:

location / {
 root /var/www;
 index index.html index.htm index.php;
 if (!-e $request_filename) {
 rewrite ^(.*)$ /index.php?s=$1 last;
 break;
 }
}


那么,现在需要同时兼容上述url示例中的三种格式又出问题了。最后解决方法如下:

location / {
 root /var/www;
 index index.html index.htm index.php;
 if (!-e $request_filename) {
 rewrite ^/index.php(.*)$ /index.php?s=$1 last;
 rewrite ^(.*)$ /index.php?s=$1 last;
 break;
 }
}



公司企业大全

推荐站点

  • 纳米AI搜索 纳米AI搜索

    纳米AI搜索开创全新问答方式,没有套路,直接给答案,让搜索变得简单直观!拍照问、语音搜、听

    www.n.cn
  • 一号屋手赚库 一号屋手赚库

    一号屋手赚库致力于分享最新且免费的手机赚钱软件,在这里,你可以找到各种类型的赚钱app,获

    www.yihaowu.com
  • 事业编招聘网 事业编招聘网

    事业编招聘网(sybzp.cn)事业单位招聘信息基考试资料原创内容网站,主打快速、全面、优

    www.sybzp.cn
  • 4K高清电影下载 4K高清电影下载

    4Kfilm视界是专业的4K电影下载站,本网站页面简洁,提供4K盘HDR杜比视界电影、美剧

    www.4kfilm.cn
  • 百评客 百评客

    百评客深度评测各种赚钱游戏、手机赚钱app,提供客观且真实的评测分析,在这里,你可以更了解

    m.baike5.com
  • 优质设计素材 优质设计素材

    颜格视觉专注海外创意广告设计图片素材下载的网站!提供包括样机素材,平面素材,UI设计,ic

    www.youngem.com
  • 国家智慧教育平台 国家智慧教育平台

    国家智慧教育平台,全称国家智慧教育公共服务平台,是由中华人民共和国教育部指导,教育部教育技

    www.smartedu.cn
  • 鸟说游戏 鸟说游戏

    鸟说是一个聚焦电竞产业的网站,旨在分享不一样的电竞乐趣。我们致力于提供最新的电竞资讯、热门

    www.niaoshuo.com
  • 游软盟 游软盟

    游软盟是一个免费的应用下载网站,为用户提供好玩的手机游戏、实用的手机软件下载,我们也会及时

    app.ufolm.com