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

  1. #第一种 普通get多参数方式
  2. htt://www.jb100.net/index.php?m=Info&a=usrInfo
  3. #第二种 pathinfo方式
  4. htt://www.jb100.net/index.php/Info/usrInfo
  5. #带有get的其他变量
  6. 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框架核心代码获取到以上三种模式的参数后
#会进行特定的处理 带不带后缀 带哪种后缀 均可配置
#也就是如下几种规则
*/

  1. #第一种
  2. htt://www.jb100.net/index.php/Info/usrInfo.html
  3. #第二种
  4. htt://www.jb100.net/index.php?s=Info/usrInfo.html
复制代码

======

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

  1. <?php
  2. print_r(pathinfo('http://www.jb100.net/test/index.txt'));
  3. ?>
复制代码

结果:

  1. Array
  2. (
  3. [dirname] => http://www.jb100.net/test
  4. [basename] => index.txt
  5. [extension] => txt
  6. [filename] => index
  7. )
复制代码

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

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

  1. http://www.jb100.net/index.php/Usr/UsrInfo
复制代码

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

  1. 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重写的部分

  1. location / {
  2. root /var/www;
  3. index index.html index.htm index.php;
  4. if (!-d $request_filename) {
  5. rewrite ^/(.*)/(.*)/*$  /index.php?m=$1&a=$2  last;
  6. break;
  7. }
  8. }
复制代码

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

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

  1. http://www.jb100.net/index.php/Usr/UsrInfo.html
复制代码

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

  1. http://www.jb100.net/Usr/UsrInfo
  2. http://www.jb100.net/Usr/UsrInfo/
复制代码

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

  1. http://www.jb100.net/Usr/UsrInfo.html
复制代码

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

#ThinkPHP可以处理的传参形式

  1. http://www.jb100.net/index.php?s=/Usr/UsrInfo
复制代码

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

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

  1. location / {
  2. root /var/www;
  3. index index.html index.htm index.php;
  4. if (!-e $request_filename) {
  5. rewrite ^(.*)$ /index.php?s=$1 last;
  6. break;
  7. }
  8. }
复制代码

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

  1. location / {
  2. root /var/www;
  3. index index.html index.htm index.php;
  4. if (!-e $request_filename) {
  5. rewrite ^/index.php(.*)$ /index.php?s=$1 last;
  6. rewrite ^(.*)$ /index.php?s=$1 last;
  7. break;
  8. }
  9. }
复制代码

转载原文地址:http://www.jb100.net/html/content-28-519-1.html

(转)nginx下基于ThinkPHP框架的网站url重写的更多相关文章

  1. nginx下基于ThinkPHP框架的网站url重写

    http { upstream phpfastcgi { server 127.0.0.1:9000 } } server { location / { if (!-e $request_filena ...

  2. ThinkPHP框架的网站url重写

    nginx location / { root /var/www; index index.html index.htm index.php; if (!-e $request_filename) { ...

  3. Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式

    下面介绍如何使Nginx支持ThinkPHP的Pathinfo和URL Rewrite模式. 1.ThinkPHP给出了ThinkPHP的官方解决方案,如下: 打开Nginx的配置文件 /etc/ng ...

  4. 【PHP】基于ThinkPHP框架搭建OAuth2.0服务

    [PHP]基于ThinkPHP框架搭建OAuth2.0服务 http://leyteris.iteye.com/blog/1483403

  5. 基于ThinkPHP框架的简单的后台管理系统

    版权声明:本文为博主原创文章,未经博主允许不得转载. 基于ThinkPHP框架的简单的后台管理系统 一个简单的后台管理系统,可能还不全面,可以自己改,有登录功能 实例如图:    

  6. Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持

    前面有关于lnmp环境的搭建,在此就不在赘述.下面就简述thinkPHP如何在nginx下开启url_rewrite和pathinfo模式支持 主要有两个步骤: 一.更改php.ini将;cgi.fi ...

  7. 在nginx下去掉ci框架url中的index.php

    ci框架默认的url规则中带有应用的入口文件,例如: example.com/index.php/news/article/my_article 在以上URL中带有入口文件index.PHP,这样的U ...

  8. 使用ThinkPHP框架高速发展网站(多图)

    使用ThinkPHP框架高速搭建站点 这一周一直忙于做实验室的站点,基本功能算是完毕了.比較有收获的是大概了解了ThinkPHP框架.写一些东西留作纪念吧.假设对于相同是Web方面新手的你有一丝丝帮助 ...

  9. 大数据下基于Tensorflow框架的深度学习示例教程

    近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用.在当今大数据时代的产业界,商业决策日益基于数据的分析作出.当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较 ...

随机推荐

  1. (转)简单的RPC java实现 .

    转:http://blog.csdn.net/jackliang55/article/details/7580563 我也承认,RPC的名声大噪之时是在2003年,那一个“冲击波”病毒(Blaster ...

  2. ArcGIS中QueryTask,FindTask,IndentifyTask 之间的区别

    1:QueryTask是一个进行空间和属性查询的功能类,它可以在某个地图服务的某个子图层内进行查询,顺便需要提一下的是,QueryTask进行查询的地图服务并 不必项加载到Map中进行显示.Query ...

  3. Greenplum(PostgreSql)中函数内游标的使用实例

    直接上代码,具体整体函数定义就不上了,只写关键部分: --定义两个变量 DECLARE CCUR REFCURSOR; -- 游标变量 RECORD1 RECORD; -- 记录变量,用来存储游标遍历 ...

  4. Detours的使用准备

    Detours是微软开发的一个函数库,可用于捕获系统API.在用其进行程序开发之前,得做一些准备工作: 一.下载Detours 在http://research.microsoft.com/sn/de ...

  5. Java-Class-C:java.util.HashMap

    ylbtech-Java-Class-C:java.util.HashMap 1.返回顶部 1.1. import java.util.HashMap; import java.util.Map; 1 ...

  6. python爬虫_从零开始破解js加密(一)

    除了一些类似字体反爬之类的奇淫技巧,js加密应该是反爬相当常见的一部分了,这也是一个分水岭,我能解决基本js加密的才能算入阶. 最近正好遇到一个比较简单的js,跟大家分享一下迅雷网盘搜索_838888 ...

  7. git提交流程简述

    1.初始化:一个项目只执行一次 只要有.git隐藏文件夹就ok了 git init 或者 git clone url 2.为远程github仓库生成别名(remote-name就是远程仓库的别名)这一 ...

  8. shell 脚本 功能性语句 read,expr,test

    1. read 从终端输入数据赋值给变量 read val 把读入的数据存放到val中 #!/bin/bash echo -n "please input two number :" ...

  9. JS事件 什么是事件?JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。

    什么是事件 JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单击 ...

  10. 随笔记录 linux命令 2019.7.29

    系统命令 一. type   查看命令是内部命令还是内部命令 help   帮助 man   在线帮助 cd      切换目录 pwd    查看所在路径 stat     查看文件详细信息 ls  ...