一、關于rewrite
rewrite語法格式:
rewrite regex replacement [flag];
任何rewrite規則的第一部分都是一個正則運算式,正則運算式中使用圓括號定義的部分可以被位置變數參考,位置變數的值取決于在正則運算式中圓括號定義的順序;
rewrite的第二部分是被重寫后的URI,該URI可以包含位置變數參考第一部分圓括號中定義的內容,
像下面的規則:
rewrite ^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$ /data?file=$3.$4 last;
- 第一組圓括號中,匹配由兩個小寫字母“a”至“z”組成的字串,可以被位置變數“$1”參考;
- 第二組圓括號中,匹配由五個小寫字母或數字組成的字串,可以被位置變數“$2”參考;
- 第三組圓括號中,匹配可能是檔案名前綴的部分,可以被位置變數“$3”參考;
- 第四組圓括號中,匹配可能是“png”或“jpg”或“gif”為后綴的檔案,可以被位置變數“$4”參考,
二、關于flag的說明
- last:停止處理rewrite模塊指令,并查找重寫后的URI匹配的location;
- break:停止處理rewrite模塊指令,并從檔案系統中查找對應目錄,目錄不存在將回傳404,如果找到對應檔案,則回傳重定向資訊,并回傳網頁內容;
- permanent:永久重定向,回傳回應狀態碼301;
- redirect:臨時重定向,回傳回應狀態碼302,
三、常用正則運算式
| 運算式 | 說明 |
|---|---|
| . | 匹配除換行符以外的其它任意字符 |
| ? | 前一個字符匹配0次或1次 |
| + | 前一個字符匹配1次或多次 |
| * | 前一個字符匹配0次或多次 |
| \d | 匹配數字 |
| ^ | 匹配字串的開始 |
| $ | 匹配字串的結尾 |
| {n} | 前一個字符匹配n次 |
| {n,} | 前一個字符匹配n次或更多次 |
| [n] | 匹配方括號中的字符 |
四、rewrite使用實體
4.1、用rewrite隱去檔案的真實路徑
假如,在“/usr/local/nginx/html/pc/static/”路徑下有“index.html”和“index1.html”,使用rewrite進行重寫:
server {
listen 80;
server_name 192.168.18.132;
root /usr/local/nginx/html;
index index.html index.htm;
rewrite ^(.*) /pc/static/$1 break;
}
因為Nginx的根路徑為“/usr/local/nginx/html”,要訪問“pc/static”路徑下的檔案,則需要在瀏覽器地址欄中寫上檔案的完整路徑,如“http://192.168.18.132/pc/static/index.html”,經過rewrite重寫后,只需要在瀏覽器中直接訪問檔案即可:
# curl http://192.168.18.132/index.html
例子中的rewrite規則,也可以這樣寫:“rewrite ^ /pc/static/$request_uri break;”,結果是一樣的,
4.2、使用rewrite將請求跳轉到指定路徑
比如,想在用戶訪問到不存在的頁面時,都將其跳轉到主頁上,防止出現404等,配置如下:
server {
listen 80;
server_name 192.168.18.132;
location / {
root /usr/local/nginx/html;
index index.html index.htm;
rewrite ^(.*)$ /index.html break;
}
}
4.3、使用rewrite將不同請求跳轉到不同的路徑
比如,為不同的設備(如PC、Android手機等)設定了不同的下載頁面,希望通過在瀏覽器地址欄輸入帶變數的URI時,可以跳轉到對應的下載頁面:
server {
listen 80;
server_name 192.168.18.132;
root /usr/local/nginx/html;
index index.html index.htm;
location /download {
if ($query_string ~* 'device=(.*?)$') {
set $dir $1;
rewrite '^/download.*?$' /data/$dir? permanent;
}
}
location /data {
try_files $uri $uri/ @default;
}
location @default {
return 200 "Hello World!";
}
}
分別為pc、ios、android設定了各自的主頁,如下:
# tree /usr/local/nginx/html/data/
/usr/local/nginx/html/data/
├── android
│ └── index.html
├── ios
│ └── index.html
└── pc
├── index.html
當在瀏覽器地址欄訪問“http://192.168.18.132/download?device=pc”,將會跳轉到相應的頁面上:
# curl -L -G -d "device=pc" http://192.168.18.132/download
<h1>PC</h1>
# curl -L -G -d "device=ios" http://192.168.18.132/download
<h1>IOS</h1>
# curl -L -G -d "device=android" http://192.168.18.132/download
<h1>Android</h1>
# curl -L -G -d "device=test" http://192.168.18.132/download
Hello World!
注意:
1)配置中的set,由于rewrite指令的第二部分使用位置變數參考正則運算式匹配的內容時,位置變數會從rewrite的第一部分去查找,所以需要將if條件中正則運算式匹配到的內容賦值給常規變數,再在rewrite中參考;
2)注意rewrite規則中,第二部分“/data/$dir?”中的“?”,作用是在跳轉后的URI中不顯示原URI的“?”后的內容,
五、關于return指令
return指令經常與error_page組合來為客戶端提供一個自定義的HTML格式頁面,或者激活一個不同的模塊來完成請求的處理,
return指令可以指示一個狀態碼,帶有一些文本的狀態碼,或者帶有URI的狀態碼,如果只有一個URI,那么狀態碼被理解為302,在將文本放在狀態碼之后時,該文本就變成了回應體,如果使用了URI,那么該URI變成了Location頭的值,客戶端將會被重定向,
try_files指令將會按照給定的引數順序查找,第一個匹配的將會使用,當給定的所有檔案都不匹配時,可以將請求傳遞到一個命名location中,
在4.3節的例子中,通過try_files首先查找檔案,再查找目錄下的檔案,最后會傳遞到命名location:“@default”中,當然也可以是一個普通的location,例如:“/error_page”或者一個自定義的錯誤頁面,如:“/error_page.html”,location中則通過return指令,回傳帶文本的回應狀態碼,用來在所有匹配失敗時給出某些資訊,
需要注意的是,命名location不能嵌套在其它location中,只能在server {}配置段中使用,
例如,通過try_files和return給出一個error_page:
location / {
try_files $uri $uri/ /error_page;
}
location /error_page {
return 404 "Page Not Found!"
}
或者回傳一個自定義的HTML頁面:
location / {
try_files $uri $uri/ /404.html;
}
或者將請求轉發到其它地址:
location / {
try_files $uri $uri/ @defaultweb;
}
location @defaultweb {
return 301 $scheme://www.example.com;
}
或者在命名location中使用反向代理:
location / {
try_files $uri $uri/ @defaultweb;
}
location @defaultweb {
proxy_pass http://webserver;
}
六、HTTP強制跳轉HTTPS
server {
listen 80;
server_name www.example.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/244838.html
標籤:其他
上一篇:最簡單的生成ios證書的方法
下一篇:qt音樂播放器
