Nginx學習筆記-URL重寫

URL重寫

在nginx中進行url重寫配置會用到rewrite模塊(ngx_http_rewrite_module)

rewrite功能時nginx提供的重寫功能。幾乎所有web產品必備技能,用於實現url重寫。url重寫時非常有用的功能,比如它可以在我們改變網站結構後,不需要客戶端修改原書籤,也不需要其他網站修改對我們網站的友情鏈接,還可以在一定成都上提高網站安全性,能夠讓我們的網站顯得更專業

nginx服務器rewrite功能的實現時依賴於pcre(perl conmpatible regular expression,perl兼容的正則表達式)的支持。所以在編譯安裝nginx之前,需要安裝pcre庫

應用場景

  • 域名變更

  • 用戶跳轉(從一個鏈接到另一個鏈接)

  • 僞靜態場景(便於CDN緩存動態頁面數據)

URL重寫原理

客戶端訪問某個域名,服務器返回一個新的地址給客戶端,客戶端使用返回的新的域名進行訪問

URL模塊語法

  • set       設置變量

  • if          負責語句中的判斷

  • return  返回返回值或URL

  • break   終止後續的rewrite規則

  • rewrite 重定向URL

rewrite規則相關指令

set指令 

自定義變量

語法:

set $variable value;

Default:

-

Context:

server,location,if

age:www.a.com:81/a重寫成www.a.com:81

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       81;
        server_name  www.a.com;
        charset utf-8;
        location /a {
            set $name hello.html;
            rewrite ^(.*)$ http://www.a.com:81/$name;
        }
    }
}

注意清理緩存

if指令 

負責判斷

if (condition) {...}

Default:

-

Context:

server,location

示例:拒絕谷歌瀏覽器訪問,返回403

這裏使用到了不區分大小寫的匹配~*

其他匹配方式:

  • ~ 匹配

  • !~ 模糊不匹配

  • =   精確匹配

  • !=  精確不匹配


    server {
        listen       81;
        server_name  www.a.com;
        charset utf-8;
        location / {
            #set $name hello.html;
            #rewrite ^(.*)$ http://www.a.com:81/$name;
            root html;
            index index.html index.htm hello.html;
            if ($http_user_agent ~* 'Chrome'){
                return 403;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     }
   }

return指令  

定義返回數據

語法:return code [text];

return code URL;

return URL;

Default: -

Context: server,location,if

示例延用上方代碼,return一個可以訪問的域名

break指令  

停止執行當前虛擬主機的後續rewrite指令集

語法:break;

Default: -

Context:server,location,if

示例:如果使用谷歌瀏覽器訪問,終止403響應碼返回

        location / {
            #set $name hello.html;
            #rewrite ^(.*)$ http://www.a.com:81/$name;
            root html;
            index index.html index.htm hello.html;
            if ($http_user_agent ~* 'Chrome'){
                  break;
                return 403;
        }

rewrite指令

語法:rewrite <regex> <replacement> [flag];

rewrite<regex><replacement>[flag]
關鍵字正則替代內容flag標記

flag:

last匹配成功後,繼續詳細匹配新的location URL規則
break匹配完成後即終止,不再匹配後面的任何規則
redirect返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
permanent返回301永久重定向沒瀏覽器地址欄會顯示跳轉後的URL地址

permanent示例:

        location / {
            rewrite ^/$ http://www.jd.com permanent;
        }

使用瀏覽器訪問web打開開發者工具,跳轉到jd且network中的響應碼爲301

將permanent替換爲redirect則會調整爲臨時重定向
注意:

重定向就是將網頁自動轉向重定向

  • 301永久重定向:新網址完全繼承舊網址,但網址的排名等完全清零

    • 301重定向是網頁更改地址後對搜索引擎友好的最好方法,只要不是暫時搬移的情況,建議使用301來做轉址

  • 302臨時性重定向:對舊網址沒有影響,但新網址不會有排名

    • 搜索引擎會抓取新的內容而保留舊的網址

break

到此結束不匹配後邊規則,將break前的web發送給用戶

last

url重寫後,馬上發起一個新的請求,再次進入server塊,重試location匹配,超過10次匹配不到返回500錯誤,地址欄url不變

如圖:

image.png

示例:根據用戶瀏覽器重寫訪問目錄

        location / {
            if ($http_user_agent ~* 'chrome') {
                rewrite ^(.*)$ /chrome/$1 last;
            }
        }
        location /chrome {
            root html;
            index  index.html index.htm;
        }

使用此範例時html下必須有chrome目錄,且有保存的uri

image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章