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. tomcat部署安全证书文件(阿里云SSL证书)

    1.下载安全证书文件: 这里使用的是阿里云SSL证书(免费一年) 2.把下载的压缩包进行解压 3.将pfx文件拷贝至服务器 4.利用jdk将pfx转jks 5.cmd进入命令行 6.切换至jdk的bi ...

  2. NOIp2018集训test-9-15(联考二day1)

    T1.矩阵游戏 水题.每一行最后乘的数为x[i],每一列为y[i],暴力算第一行的列的贡献,每一行的列的贡献是公差为所有列的贡献之和的等差数列,然后每一行再乘上行的贡献求和即为答案. //Achen ...

  3. c# ToString()格式大全(转)

    stringstr1 =string.Format("{0:N1}",56789);               //result: 56,789.0stringstr2 =str ...

  4. hash值的计算与转换 分类: ACM TYPE 2015-05-07 17:49 36人阅读 评论(0) 收藏

    #include <bits/stdc++.h> using namespace std; const int MAXN = 100; const int X = 3; long long ...

  5. 大道浮屠诀---cwRsync同步工具的使用

    目的: 在日常生活中,我们有时候会遇到这样类似的问题 ---需要把一台服务器上的某个重要的文件进行备份(拷贝另外的服务器上) ---需要同步系统上的配置文件到其他系统 利用此cwRsync软件可以解决 ...

  6. java锁分析

    import java.util.concurrent.TimeUnit; class Phone//Phone.java ---> Phone.class Class.forName(); { ...

  7. 中文linux安装oracle界面乱码解决方案

    来自:http://blog.csdn.net/h249059945/article/details/12122853 在linux的中文操作系统下使用xmanager进行oracle进行安装的时候, ...

  8. spring MVC 全局的异常处理

    1.使用SimpleMappingExceptionResolver实现异常处理 在Spring的配置文件applicationContext.xml中增加以下内容: <bean class=& ...

  9. 【学术篇】SPOJ QTREE 树链剖分

    发现链剖这东西好久不写想一遍写对是有难度的.. 果然是熟能生巧吧.. WC的dalao们都回来了 然后就用WC的毒瘤题荼毒了我们一波, 本来想打个T1 44分暴力 然后好像是特判写挂了还是怎么的就只能 ...

  10. AndroidStudio 搜索导入自己需要的库

    前言 在Androidx的库应用后,导致有需多系统组件库需要重新 implementation 升级为Androidx, 但是你可能会发现不知道怎么导入他们.  当然除了导入Android的组件库,还 ...