Nginx如何實(shí)現(xiàn)pathinfo模式的方法詳解
什么是pathinfo模式呢?
pathinfo是偽靜態(tài)的一種,我們先解釋一下偽靜態(tài)的概念,偽靜態(tài)頁(yè)面是靜態(tài)URL與動(dòng)態(tài)URL互通的一個(gè)橋梁,它是指動(dòng)態(tài)網(wǎng)址通過URL重寫的手段去掉其動(dòng)態(tài)參數(shù),使URL靜態(tài)化,但在實(shí)際的網(wǎng)頁(yè)目錄中并沒有重寫URL。簡(jiǎn)單來(lái)說,偽靜態(tài)URL就是通過服務(wù)器轉(zhuǎn)換偽裝文件名或地址,使該頁(yè)面類似于靜態(tài)頁(yè)面,但服務(wù)器上沒有獨(dú)立存在的文件,其本質(zhì)還是動(dòng)態(tài)頁(yè)面。
使用過 ThinkPHP 框架開發(fā)應(yīng)用的同學(xué)應(yīng)該都會(huì)知道,它有一種 URL 模式就是 pathinfo,看起來(lái)類似下面的 URL:
http://example.com/module/controller/action/key1/value1/key2/value2.html
其實(shí)上面的 URL 的原型是下面的樣子:
// 這個(gè)才是正宗的 URL,上面那個(gè)是冒牌的 http://example.com/index.php?m=module&c=controller&a=action&key1=value1&key2=value2
既然 pathinfo 模式的 URL 不是正宗的,那為什么不用正宗的呢,用正宗的不好嗎?相對(duì)于正宗的 URL,pathinfo 模式的確實(shí)是有優(yōu)勢(shì)的,以下簡(jiǎn)單列舉幾項(xiàng)它的好處。
- 它提供了最好的SEO支持
- 可以實(shí)現(xiàn) URL 的偽靜態(tài)
- 它看起來(lái)更簡(jiǎn)潔、更好看
pathinfo 模式的 URL 有這么多優(yōu)點(diǎn),那我們肯定要支持了。ThinkPHP 更多的 URL 模式配置及實(shí)現(xiàn),可以參考這篇文檔。
本文主要討論的是 pathinfo 模式的 URL 在 Nginx 中的實(shí)現(xiàn),ThinkPHP 官方文檔中沒有介紹,但是它實(shí)現(xiàn)起來(lái)也挺簡(jiǎn)單的。以下是實(shí)現(xiàn)過程的一些思考。
一個(gè)標(biāo)準(zhǔn)的通用的 URL 格式是類似下面那樣子的:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
參照通用的 URL 格式,對(duì)比可以發(fā)現(xiàn),pathinfo 模式的相對(duì)于標(biāo)準(zhǔn)模式的 URL,有兩個(gè)地方的區(qū)別比較大,一個(gè)是沒有了 index.php 文件,另一個(gè)是查詢參數(shù)并沒有使用符號(hào)“?”隔開。
現(xiàn)在要做的就是在 Nginx 接收的 pathinfo 模式的 URL 請(qǐng)求時(shí),將它還原成標(biāo)準(zhǔn)的 URL 模式,這樣服務(wù)器就能正常處理了。
把缺失的 index.php 文件補(bǔ)上
這個(gè)需要用到 Nginx 的 rewrite 指令,它的作用是將請(qǐng)求的 URI 替換成目標(biāo) URL。在這里需要達(dá)到的效果是,將
http://example.com/module/controller/action/key1/value1/key2/value2.html
替換成
http://example.com/index.php/module/controller/action/key1/value1/key2/value2.html
當(dāng)然,并不是所有的 URI 都會(huì)進(jìn)行此規(guī)則的重寫,只有那些不是文件的 URI 才進(jìn)行重寫。所以,關(guān)于重寫的指令將會(huì)類似下面的:
# 如果請(qǐng)求的文件不存在,則進(jìn)行 URI 重寫
# 在原有的基礎(chǔ)上添加入口文件 index.php
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
}
通過以上配置就能達(dá)到補(bǔ)全 index.php 入口文件的效果了。
區(qū)分符號(hào) ?前后的內(nèi)容
在通用的 URL 中,符號(hào)“?”是具有特殊作用的,它是用來(lái)將查詢字符串和前面的文件隔開。在 pathinfo 模式的 URL 中,符號(hào)“?”沒有了,也就是說,服務(wù)器無(wú)法區(qū)分 URI 中哪些是文件,哪些是查詢字符串了。所以,我們的目的是將 pathinfo 模式中本來(lái)應(yīng)該由符號(hào)“?”區(qū)分的內(nèi)容給手動(dòng)區(qū)分開來(lái)。
還好,Nginx 中有個(gè)指令可以實(shí)現(xiàn)我們的目的,fastcgi_split_path_info。它可以將正則表達(dá)式定義的兩個(gè)串分別賦值給變量 $fastcgi_script_name 和變量 $fastcgi_path_info,以供后文使用。更多關(guān)于 fastcgi_split_path_info 的信息,請(qǐng)查閱這里
相關(guān)配置類似下面的代碼:
location ~ ^(.+\.php)(.*)$ {
root /var/www/html/$vhost_path;
fastcgi_pass phpfpm:9000;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
一個(gè)簡(jiǎn)單的例子
通過上面兩部份的配置,現(xiàn)在的 Nginx 服務(wù)器已經(jīng)支持 pathinfo 模式的 URL 了,以下是一個(gè)簡(jiǎn)單的 server 配置,僅供參考:
server {
listen 80;
server_name tp5.loc;
set $vhost_path tp5/public;
location / {
root /usr/share/nginx/html/$vhost_path;
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
}
}
location ~ ^(.+\.php)(.*)$ {
root /var/www/html/$vhost_path;
fastcgi_pass phpfpm:9000;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
}
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Nginx為靜態(tài)資源配置緩存時(shí)間的操作步驟
最近在優(yōu)化網(wǎng)站性能時(shí),發(fā)現(xiàn)很多靜態(tài)資源(比如圖片、CSS?文件等)每次都會(huì)從服務(wù)器重新加載,這不僅浪費(fèi)了帶寬,還增加了 服務(wù)器的負(fù)載,為了解決這個(gè)問題,我研究了一下如何在?Nginx?中為靜態(tài)資源配置緩存時(shí)間,下面是我的配置過程,需要的朋友可以參考下2025-02-02
使用nginx部署前端項(xiàng)目的實(shí)現(xiàn)
前端項(xiàng)目的部署以前一直是把靜態(tài)資源放到后端工程中,隨后端部署一起部署,本文主要介紹了使用nginx部署前端項(xiàng)目的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
Nginx could not build the server_names_hash 錯(cuò)誤的解決辦法
這篇文章主要介紹了Nginx could not build the server_names_hash 錯(cuò)誤的解決辦法,需要的朋友可以參考下2014-03-03
在Nginx中阻止來(lái)自特定的IP地址訪問的操作指南
在網(wǎng)絡(luò)安全方面,有時(shí)你可能需要限制特定國(guó)家或地區(qū)的訪問權(quán)限,本文將介紹如何使用?Nginx?配置文件來(lái)阻止來(lái)自特定國(guó)家或地區(qū)的?IP?地址訪問你的網(wǎng)站,需要的朋友可以參考下2024-07-07
使用supervisor管理nginx+tomcat容器的方法示例
這篇文章主要介紹了使用supervisor管理nginx+tomcat容器的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
nginx封空user_agent實(shí)現(xiàn)封禁迅雷的方法
nginx封空user_agent實(shí)現(xiàn)封禁迅雷的方法,需要的朋友可以參考下。2010-11-11
服務(wù)器的負(fù)載均衡nginx+tomcat實(shí)現(xiàn)動(dòng)靜分離
這篇文章主要為大家介紹了服務(wù)器的負(fù)載均衡nginx+tomcat實(shí)現(xiàn)動(dòng)靜分離的案例實(shí)施步驟以及環(huán)境詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
在網(wǎng)關(guān)中使用Nginx配置HTTP透明代理案例
這篇文章主要介紹了在網(wǎng)關(guān)中使用Nginx配置HTTP透明代理案例,中間還需要iptables配合,需要的朋友可以參考下2014-06-06

