最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解常用的nginx rewrite重寫規(guī)則

 更新時間:2019年03月07日 10:53:14   作者:LanceZhen  
這篇文章主要介紹了詳解常用的nginx rewrite重寫規(guī)則,Nginx的rewrite功能是使用nginx提供的全局變量或自己設(shè)置的變量,結(jié)合正則表達式和標志位實現(xiàn)url重寫以及重定向。感興趣的可以一起來了解一下

本文提供一些常用的rewrite重寫規(guī)則,用來美化網(wǎng)頁的鏈接。規(guī)則里面的$1$2你不知道是怎么來的話,只要記住,第一個()里面的是$1,第二個()里面的是$2.

請求的URL是給人看的,重寫后的URL是給電腦看的。

執(zhí)行搜索

這個規(guī)則的目的是為了執(zhí)行搜索,搜索URL中包含的關(guān)鍵字。

請求的URL //hqidi.com/search/some-search-keywords
重寫后URL //hqidi.com/search.php?p=some-search-keywords
重寫規(guī)則         rewrite ^/search/(.*)$ /search.php?p=$1?;

用戶個人資料頁面

大多數(shù)運行訪問者注冊的動態(tài)網(wǎng)站都提供一個可以查看個人資料的頁面,這個頁面的URL包含用戶的UID和用戶名

請求的URL //hqidi.com/user/47/dige
重寫后URL //hqidi.com/user.php?id=47&name=dige
重寫規(guī)則         rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;

多個參數(shù)

有些網(wǎng)站對字符串參數(shù)使用不同的語法,例如 通過斜線“/”來分隔非命名參數(shù)

請求的URL //hqidi.com/index.php/param1/param2/param3
重寫后URL //hqidi.com/index.php?p1=param1&p2=param2&p3=param3
重寫規(guī)則         rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;

類似百科的格式

這種格式特點,一個前綴目錄,后跟文章名稱

請求的URL //hqidi.com/wiki/some-keywords
重寫后URL //hqidi.com/wiki/index.php?title=some-keywords
重寫規(guī)則         rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;

論壇

論壇一般用到兩個參數(shù),一個話題標識(topic)一個出發(fā)點(starting post)

請求的URL //hqidi.com/topic-1234-50-some-keywords.html
重寫后URL //hqidi.com/viewtopic.php?topic=1234&start=50
重寫規(guī)則         rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ viewtopic.php?topic=$1&start=$2?;

新網(wǎng)站的文章

這種URL結(jié)構(gòu)的特點,由一個文章標識符,后跟一個斜線,和一個關(guān)鍵字列表組成。

請求的URL //hqidi.com/88/future
重寫后URL //hqidi.com/atricle.php?id=88
重寫規(guī)則         rewrite ^/([0-9]+)/.*$ /aticle.php?id=$1?;

最后一個問號

若被替換的URI中含有參數(shù)(類似/app/test.php?id=5之類的URI),默認情況下參數(shù)會被自動附加到替換串上,可以通過在替換串的末尾加上?標記來解決這一問題。

rewrite ^/users/(.*)$ /show?user=$1? last;

比較一個加上?標記和不加?標記的URL跳轉(zhuǎn)區(qū)別:

rewrite ^/test(.*)$ //hqidi.com/home premanent;

訪問//hqidi.com/test?id=5 經(jīng)過301跳轉(zhuǎn)后的URL地址為 //hqidi.com/home?id=5

rewrite ^/test(.*)$ //hqidi.com/home? premanent;

訪問//hqidi.com/test?id=5 經(jīng)過301跳轉(zhuǎn)后的URL地址為 //hqidi.com/home

Nginx的rewrite功能需要PCRE軟件的支持,即通過perl兼容正則表達式語句進行規(guī)則匹配的。默認參數(shù)編譯nginx就會支持rewrite的模塊,但是也必須要PCRE的支持

rewrite是實現(xiàn)URL重寫的關(guān)鍵指令,根據(jù)regex(正則表達式)部分內(nèi)容,重定向到replacement,結(jié)尾是flag標記。

nginx rewrite指令執(zhí)行順序

1.執(zhí)行server塊的rewrite指令(這里的塊指的是server關(guān)鍵字后{}包圍的區(qū)域,其它xx塊類似)
2.執(zhí)行l(wèi)ocation匹配
3.執(zhí)行選定的location中的rewrite指令

如果其中某步URI被重寫,則重新循環(huán)執(zhí)行1-3,直到找到真實存在的文件。

如果循環(huán)超過10次,則返回500 Internal Server Error錯誤。

flag標志位

rewrite的語法很簡單,如:

rewrite regex URL [flag];

rewrite是關(guān)鍵字,regex是正則表達式,URL是要替代的內(nèi)容,[flag]是標記位的意思,它有以下幾種值:

  • last: 相當于Apache的[L]標記,表示完成rewrite
  • break: 停止執(zhí)行當前虛擬主機的后續(xù)rewrite指令集
  • redirect: 返回302臨時重定向,地址欄會顯示跳轉(zhuǎn)后的地址
  • permanent: 返回301永久重定向,地址欄會顯示跳轉(zhuǎn)后的地址

因為301和302不能簡單的只返回狀態(tài)碼,還必須有重定向的URL,這就是return指令無法返回301,302的原因了。這里 last 和 break 區(qū)別有點難以理解:

  • last一般寫在server和if中,而break一般使用在location中
  • last不終止重寫后的url匹配,即新的url會再從server走一遍匹配流程,而break終止重寫后的匹配
  • break和last都能組織繼續(xù)執(zhí)行后面的rewrite指令

來看一個簡單實例:

rewrite ^/listings/(.*)$ /listing.html?listing=$1 last;
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;

第一條重寫規(guī)則中,我們可以使用友好的URL:http://mysite.com/listings/123代替http://mysite.com/listing.html?listing=123,就相當于我們在瀏覽器的地址欄中輸入http://mysite.com/listings/123后,實際訪問的URL資源是http://mysite.com/listing.html?listing=123。

第二條規(guī)則中,對形如http://mysite.com/images/bla_500x400.jpg的文件請求,重寫到http://mysite.com/resizer/bla.jpg?width=500&height=400地址,并會繼續(xù)嘗試匹配location。

if指令與全局變量

if指令語法為if(condition){...},對給定的條件condition進行判斷。如果為真,大括號內(nèi)的rewrite指令將被執(zhí)行。

來看代碼規(guī)則:

if ($http_user_agent ~ MSIE) {
  rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite請求到/msid/目錄下
 
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
  set $id $1;
 } //如果cookie匹配正則,設(shè)置變量$id等于正則引用部分
 
if ($request_method = POST) {
  return 405;
} //如果提交方法為POST,則返回狀態(tài)405(Method not allowed)。return不能返回301,302
 
if ($slow) {
  limit_rate 10k;
} //限速,$slow可以通過 set 指令設(shè)置
 
if (!-f $request_filename){
  break;
  proxy_pass http://127.0.0.1; 
} //如果請求的文件名不存在,則反向代理到localhost 。這里的break也是停止rewrite檢查
 
if ($args ~ post=140){
  rewrite ^ http://mysite.com/ permanent;
} //如果query string中包含"post=140",永久重定向到mysite.com

if指令中,可以使用全局變量,這些變量有:

  • $args: #這個變量等于請求行中的參數(shù),同$query_string
  • $content_length: 請求頭中的Content-length字段。
  • $content_type: 請求頭中的Content-Type字段。
  • $document_root: 當前請求在root指令中指定的值。
  • $host: 請求主機頭字段,否則為服務(wù)器名稱。
  • $http_user_agent: 客戶端agent信息
  • $http_cookie: 客戶端cookie信息
  • $limit_rate: 這個變量可以限制連接速率。
  • $request_method: 客戶端請求的動作,通常為GET或POST。
  • $remote_addr: 客戶端的IP地址。
  • $remote_port: 客戶端的端口。
  • $remote_user: 已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。
  • $request_filename: 當前請求的文件路徑,由root或alias指令與URI請求生成。
  • $scheme: HTTP協(xié)議(如http,https)。
  • $server_protocol: 請求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr: 服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個值。
  • $server_name: 服務(wù)器名稱。
  • $server_port: 請求到達服務(wù)器的端口號。
  • $request_uri: 包含請求參數(shù)的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
  • $uri: 不帶請求參數(shù)的當前URI,$uri不包含主機名,如”/foo/bar.html”。
  • $document_uri: 與$uri相同。

使用return跳轉(zhuǎn)

我們有時需要在Nginx上使用rewrite做301地址跳轉(zhuǎn),比如以下規(guī)則:

rewrite ^ $scheme://www.mysite.com$request_uri permanent;

當訪問任意url都會301永久定向到www.mysite.com的url上。這個寫法沒錯,但是因為使用了rewrite的正則匹配,會損耗一部分資源,nginx官網(wǎng)不推薦這樣寫。我們可以使用return同樣可以實現(xiàn)301跳轉(zhuǎn),簡單實用,看實例:

301永久定向到新域名

server {
  listen 80;
  listen 443 ssl;
  server_name www.old-name.com old-name.com;
  return 301 $scheme://www.new-name.com;
}

以上代碼實現(xiàn)了老域名301跳轉(zhuǎn)到新域名上,假如網(wǎng)站要更換新域名的話使用此方法做301跳轉(zhuǎn)。

不帶www的域名301跳轉(zhuǎn)到帶www的域名

server {
  listen 80;
  listen 443 ssl;
  server_name mysite.com;
  return 301 $scheme://www.mysite.com$request_uri;
}

http站點301跳轉(zhuǎn)到https站點

server {
  listen 80;
  server_name www.mysite.com;
  return 301 https://www.mysite.com$request_uri;
}

以上就是有關(guān)Nginx的rewrite重寫與重定向的介紹,覺得有用就請練習多遍,收藏好此文不迷路。也希望大家多多支持腳本之家。

相關(guān)文章

  • nginx加php-fpm出現(xiàn)502 bad gateway錯誤的5種解決方法

    nginx加php-fpm出現(xiàn)502 bad gateway錯誤的5種解決方法

    這篇文章主要介紹了nginx加php-fpm環(huán)境中出現(xiàn)502 bad gateway錯誤的5種解決方法,總結(jié)歸納服務(wù)器出現(xiàn)502錯誤的原因多數(shù)為連接過多和腳本超時,本文總結(jié)了5種解決方法,需要的朋友可以參考下
    2014-05-05
  • 關(guān)于Nginx 命令行控制的問題

    關(guān)于Nginx 命令行控制的問題

    Nginx 是一個高性能的 Web 服務(wù)器,從 2001 年發(fā)展至今,由于 Nginx 對硬件和操作系統(tǒng)內(nèi)核特性的深度挖掘,使得在保持高并發(fā)的同時還能夠保持高吞吐量,這篇文章主要介紹了Nginx 命令行控制,需要的朋友可以參考下
    2022-10-10
  • 如何將Nginx配置為使用systemctl管理

    如何將Nginx配置為使用systemctl管理

    這篇文章主要介紹了如何將Nginx配置為使用systemctl管理的實現(xiàn)過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 一臺nginx服務(wù)器多域名配置的方法

    一臺nginx服務(wù)器多域名配置的方法

    本篇文章主要介紹了一臺nginx服務(wù)器多域名配置的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • nginx日志切割/分割之按天生成及定期刪除日志

    nginx日志切割/分割之按天生成及定期刪除日志

    這篇文章主要給大家介紹了關(guān)于nginx日志切割/分割之按天生成及定期刪除日志的相關(guān)資料,日志文件大會影響訪問的速度和查找難度,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Nginx負載均衡配置實例

    Nginx負載均衡配置實例

    這篇文章主要介紹了Nginx負載均衡配置實例,隨著互聯(lián)網(wǎng)信息的爆炸性增長,負載均衡已經(jīng)不再是一個很陌生的話題,顧名思義,負載均衡即是將負載分攤到不同的服務(wù)單元,既保證服務(wù)的可用性,又保證響應(yīng)足夠快,給用戶很好的體驗,需要的朋友可以參考下
    2023-07-07
  • Nginx Rewrite使用場景及配置方法解析

    Nginx Rewrite使用場景及配置方法解析

    這篇文章主要介紹了Nginx Rewrite使用場景及配置方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Nginx HTTP:413 Request Entity Too Large解決方法

    Nginx HTTP:413 Request Entity Too Large解決方法

    這篇文章主要介紹了Nginx HTTP:413 Request Entity Too Large解決方法,這個問題需要修改PHP配置以及Nginx配置才可以解決,需要的朋友可以參考下
    2015-07-07
  • 使用nginx同域名下部署多個vue項目并使用反向代理的方法

    使用nginx同域名下部署多個vue項目并使用反向代理的方法

    這篇文章主要介紹了使用nginx同域名下部署多個vue項目并使用反向代理的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • nginx 訪問限制與訪問控制的實現(xiàn)

    nginx 訪問限制與訪問控制的實現(xiàn)

    訪問控制要做的事情是控制客戶端的資源訪問權(quán)限,本文主要介紹了nginx 訪問限制與訪問控制的實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02

最新評論

南江县| 郎溪县| 香港| 穆棱市| 海兴县| 响水县| 榕江县| 吕梁市| 汤原县| 宁武县| 丰都县| 盐津县| 临高县| 如东县| 新龙县| 远安县| 抚顺市| 淮南市| 内乡县| 阳西县| 柳州市| 怀化市| 盐山县| 深水埗区| 琼结县| 维西| 光山县| 榕江县| 四川省| 恩施市| 云阳县| 阳朔县| 二连浩特市| 巴楚县| 黎城县| 大田县| 南安市| 西林县| 肥东县| 辽宁省| 浪卡子县|