目錄
一、重寫功能
1.重寫功能作用
2.rewrite指令
? ?if指令
? ?return指令
? ?set指令
? ?break指令
3.rewrite標志
? ?redirect標志
? ?permanent標志
? ?break標志
? ?last標志
? ?rewrite標志實驗
一、重寫功能
1.重寫功能作用
??重寫功能(rewrite)用于實現URL的重寫,URL的重寫是非常有用的功能,比如它可以在我們改變網站結構之后,不需要客戶端修改原來的書簽,也無需其他網站修改我們的鏈接,就可以設置為訪問,另外還可以在一定程度上提高網站的安全性。
2.rewrite指令
? ?if指令
? ? ? ? 用于條件匹配判斷,并根據條件判斷結果選擇不同的Nginx配置,可以配置在server或location塊中進行配置,Nginx的if語法僅能使用if做單次判斷可以在server模塊和location模塊,不支持使用if else或者if elif這樣的多重判斷,用法如下:
?if ( ? [連接符] ? 條件匹配 ?){
執行動作;
}
條件匹配連接符:
= 比較變量和字符串是否相等,相等為true。
!= 比較變量和字符串是否不相等,不相等為true。
~ 區分大小寫,判斷字符是否匹配,匹配為true。
~* 不區分大小寫,判斷字符是否匹配,匹配為true。
-f 和 !-f #判斷請求的文件是否存在和是否不存在。
-d 和 !-d #判斷請求的目錄是否存在和是否不存在。
-x 和 !-x #判斷文件是否可執行和是否不可執行。
-e 和 !-e #判斷請求的文件或目錄是否存在和是否不存在(包括文件,目錄,軟鏈接) 。
舉例:
location /main {index index.html;default_type text/html;
#定義文件類型if ( $scheme = http ){
#如果用戶訪問的協議是http,$scheme變量表示用戶來訪問使用的協議。 echo "if-----> $scheme";
#則輸出if --->協議 }if ( $scheme = https ){
#如果用戶訪問的協議是https,$scheme變量表示用戶來訪問使用的協議。 echo "if ----> $scheme";
#則輸出if --->協議 }
? ?return指令
? ? return用于完成對請求的處理,并直接向客戶端返回響應狀態碼,比如:可以指定重定向URL(對于特殊重定向狀態碼,301/302等) 或者是指定提示文本內容(對于特殊狀態碼403/500等),處于此指令后的所有配置都將不被執行,return可以在server、if 和 location塊進行配置。
使用格式: ? ? ? ?
return code :返回狀態碼
return code [text]:返回狀態碼可以選擇性加一個文本
return code url :返回某個狀態碼直接跳轉到某個url
舉例:訪問/test文件直接返回403報錯
server {
#server模塊listen 80;
#監聽所有80端口server_name www.kgc.com;
#虛擬主機www.kgc.com root /data/nginx/pc;
#定義根目錄位置location /test{return 403;
#location模塊訪問根下的/test即返回403錯誤
}
}
? ?set指令
設置變量,例如set $name kgc 設置name變量值為kgc。
location /main {root /data/nginx/html/pc;index index.html;default_type text/html;set $name kgc;
#定義變量name的值為kgcreturn $name;
#返回name變量的值
}
? ?break指令
只跳出 rewrite中的(if , set ,return)指令,其他不跳出,如server模塊內的不跳出。
location /main {root /data/nginx/html/pc;index index.html;default_type text/html;set $name kgc;
#定義name變量為kgcreturn $name;
#返回name變量值break;
#location塊中break后面指令還會執行,只會跳過rewrite中4個指令的內容,其他內容繼續執行set $my_port $server_port;echo $my_port;
#輸出為空,因為跳過了set指令的執行內容。echo命令需要安裝第三方模塊}
3.rewrite標志
?格式: rewrite 客戶輸入的(可用原始url正則表示)? ?你想讓客戶訪問的?(可用url正則表示)? ? ?標志(即動作)
. 表示任意字符
\d 表示匹配數字
* 表示任意長度字符包括0次
.* 表示任意長度字符不包括0次
? ?redirect標志
redirect 等于302即臨時重定向,不會在瀏覽器中緩存。
? ?permanent標志
permanent 等于301即永久重定向,會在瀏覽器中緩存。
? ?break標志
break標志會重定向,但是不會顯示跳轉后的域名,只顯示用戶輸入的域名。
? ?last標志
last標志,重寫完成后,停止對當前URI在當前location中后續的其它重寫操作,而后對新的URL啟動新一輪重寫檢查,不建議在location中使用。
? ?rewrite標志實驗
1、首先在主配置文件中創建2個虛擬主機,www.bj.com和www.beijing.com并且使用rewrite指令使得訪問www.bj.com時跳轉到www.beijing.com。
redirect、permanent實例,訪問www.bj.com跳轉到www.beijing.com
配置文件中添加:
server {listen 80;
#監聽80端口server_name www.bj.com;
#虛擬主機www.bj.comroot /data/nginx/bj;
#虛擬主機1根目錄location / {root /data/nginx/bj;
#虛擬主機1根目錄rewrite / http://www.beijing.com permanent;
#訪問虛擬主機1 www.bj.com時使用rewrite永久重定向到www.beijing.com。注意此處協議寫全
}}
server {listen 80;
#監聽80端口server_name www.beijing.com;
#虛擬主機2 www.beijing.comroot /data/nginx/beijing;
#虛擬主機2根目錄
}
nging -t
#檢查配置文件是否有錯誤
nginx -s reload
#熱加載nginx配置文件
2、創建虛擬主機1和虛擬主機2的根目錄并在虛擬主機1即www.bj.com的index.html中寫入內容“this? is? bj”在虛擬主機2的根目錄即www.beijing.com的index.html中寫入內容“this is bj jump beijing”?
mkdir -p /data/nginx/bj
#創建www.bj.com的根目錄
mkdir -p /data/nginx/beijing
#創建www.beijing.com的根目錄
echo "this is bj">/data/nginx/bj/index.html
#將this is bj 寫入www.bj.com的根目錄文件index.html中
echo "this is bj jump beijing">/data/nginx/beijing/index.html
#將this is bj jump beijing 寫入www.beijing.com的根目錄文件index.html中
3、使用另外一臺機器在/etc/hosts中添加本機ip對應www.bj.com和www.beijing.com。然后使用curl訪問查看是否為302永久重定向提示,然后使用curl 域名? -L,查看跳轉后的網頁內容。
vim /etc/hosts
#編輯hosts文件
#添加內容:
192.168.30.11 www.bj.com www.beijing.com
#此處ip為自己ip
4、redirect臨時重定向和break使用只需要將配置文件中的permanent改為對應標志即可