nginx下基于ThinkPHP框架的网站url重写
nginx下基于ThinkPHP框架的网站url重写
nginx下的基于thinkphp的应用的url重写,需了解thinkphp的各种url格式参数的处理逻辑以及nginx重写的原理。简单点说,无论哪种url格式,nginx都需要执行ThinkPHP下的应用单一入口文件,然后将各种url格式按照一定的格式规则进行进行参数化处理,最终执行指定模块与控制器;这个过程用户是看不到的,用户只能看到各种规则的url,这些url的规则如下:#第一种 普通get多参数方式<br>
htt://www.jb100.net/index.php?m=Info&a=usrInfo<br>
<br>
#第二种 pathinfo方式<br>
htt://www.jb100.net/index.php/Info/usrInfo<br>
#带有get的其他变量<br>
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框架核心代码获取到以上三种模式的参数后
#会进行特定的处理 带不带后缀 带哪种后缀 均可配置
#也就是如下几种规则
*/#第一种<br>
htt://www.jb100.net/index.php/Info/usrInfo.html<br>
#第二种<br>
htt://www.jb100.net/index.php?s=Info/usrInfo.html
======
什么是pathinfo?pathinfo是php的功能,nginx并没有pathinfo功能,在php中书写如下代码:<?php <br />
<br>
print_r(pathinfo('http://www.jb100.net/test/index.txt'));<br>
<br>
?>
结果:Array<br>
(<br>
[dirname] => http://www.jb100.net/test<br>
[basename] => index.txt<br>
[extension] => txt<br>
[filename] => index<br>
)
通过以上运行结果,可以看到打印出来的数组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 / {<br>
root /var/www;<br>
index index.html index.htm index.php;<br>
if (!-d $request_filename) {<br>
rewrite ^/(.*)/(.*)/*$ /index.php?m=$1&a=$2 last;<br>
break;<br>
}<br>
}
但问题出现了,基于ThinkPHP的应用不仅仅只有上述例子中的这种pathinfo模式,现在变成这样的了:(为了便于解说,称如下代码段为“url示例”,后方提到“url示例”就是指此处的三种url格式)
#第一种,未隐藏index.php 但url路径中有.html后缀http://www.jb100.net/index.php/Usr/UsrInfo.html
#第二种,隐藏脚本文件index.phphttp://www.jb100.net/Usr/UsrInfo<br>
或<br>
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 / {<br>
root /var/www;<br>
index index.html index.htm index.php;<br>
if (!-e $request_filename) {<br>
rewrite ^(.*)$ /index.php?s=$1 last;<br>
break;<br>
}<br>
}
那么,现在需要同时兼容上述url示例中的三种格式又出问题了。最后解决方法如下:location / {<br>
root /var/www;<br>
index index.html index.htm index.php;<br>
if (!-e $request_filename) {<br>
rewrite ^/index.php(.*)$ /index.php?s=$1 last;<br>
rewrite ^(.*)$ /index.php?s=$1 last;<br>
break;<br>
}<br>
}
转载原文地址:http://www.jb100.net/html/content-28-519-1.html
AD:真正免费,域名+虚机+企业邮箱=0元

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

了解Python程式設計的入門程式碼範例Python是一種簡單易學,功能強大的程式語言。對於初學者來說,了解Python程式設計的入門級程式碼範例是非常重要的。本文將為您提供一些具體的程式碼範例,幫助您快速入門。列印HelloWorldprint("HelloWorld")這是Python中最簡單的程式碼範例。 print()函數用於將指定的內容輸出

《Go語言程式設計實例:Web開發中的程式碼範例》隨著網路的快速發展,Web開發已成為各行業中不可或缺的一部分。作為一門功能強大且效能優越的程式語言,Go語言在Web開發中越來越受到開發者們的青睞。本文將透過具體的程式碼範例,介紹如何利用Go語言進行Web開發,讓讀者更能理解並運用Go語言來建立自己的Web應用。 1.簡單的HTTP伺服器首先,讓我們從一個

PHP變數儲存程式運行期間的值,對於建立動態且互動的WEB應用程式至關重要。本文將深入探討php變量,並透過10個真實的範例展示它們的實際應用。 1.儲存使用者輸入$username=$_POST["username"];$passWord=$_POST["password"];此範例從表單提交中提取使用者名稱和密碼,並將其儲存在變數中以供進一步處理。 2.設定配置值$database_host="localhost";$database_username="username";$database_pa

Java冒泡排序最簡單的程式碼範例冒泡排序是一種常見的排序演算法,它的基本想法是透過相鄰元素的比較和交換來將待排序序列逐步調整為有序序列。以下是一個簡單的Java程式碼範例,示範如何實作冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

如何使用PHP編寫庫存管理系統中的庫存分倉管理功能碼庫存管理是許多企業中不可或缺的一部分。對於擁有多個倉庫的企業來說,庫存分倉管理功能尤其重要。透過合理管理和追蹤庫存,企業可以實現不同倉庫之間的庫存調撥,優化營運成本,改善協同效率。本文將介紹如何使用PHP編寫庫存分倉管理功能的程式碼,並為您提供相關的程式碼範例。一、建立資料庫在開始編寫庫存分倉管理功能的程式碼之

華為雲端邊緣運算對接指南:Java程式碼範例快速實現介面隨著物聯網技術的快速發展和邊緣運算的興起,越來越多的企業開始關注邊緣運算的應用。華為雲端提供了邊緣運算服務,為企業提供了高可靠的運算資源和便利的開發環境,使得邊緣運算應用更容易實現。本文將介紹如何透過Java程式碼快速實現華為雲端邊緣運算的介面。首先,我們需要準備好開發環境。確保你已經安裝了Java開發工具包(

標題:從入門到精通:Go語言中常用資料結構的程式碼實作資料結構在程式設計中起著至關重要的作用,它是程式設計的基礎。在Go語言中,有許多常用的資料結構,掌握這些資料結構的實作方式對於成為優秀的程式設計師至關重要。本文將介紹Go語言中常用的資料結構,並給出對應的程式碼範例,幫助讀者從入門到精通這些資料結構。 1.數組(Array)數組是一種基本的資料結構,是一組相同類型

Java選擇排序法程式碼編寫指南及範例選擇排序是一種簡單直觀的排序演算法,其想法是每次從未排序的元素中選擇最小(或最大)的元素進行交換,直到所有元素排序完成。本文將提供選擇排序的程式碼編寫指南,並附上具體的Java範例程式碼。演算法原理選擇排序的基本原理是將待排序數組分為已排序和未排序兩部分,每次從未排序部分選擇最小(或最大)的元素,將其放到已排序部分的末尾。重複上述
