nginx----Rewrite語法
Rewrite規則:
常用的命令 if (條件) {} 設定條件,再進行重寫 set #設定變數 return #返回狀態碼 break #跳出rewrite rewrite #重寫 |
if語法格式:
If 空格 (條件) {
重寫模式
}
根據方法重寫:
if ($request_method = GET) {
return 405;
}
判斷瀏覽器重寫:
if ($http_user_agent ~ MSIE) { #return 404; rewrite ^(.*)$ /ie.html break; }
條件又怎麼寫?
答:3種寫法
1: “=”來判斷相等, 用於字串比較
2: “~” 用正則來匹配(此處的正則區分大小寫)
~* 不區分大小寫的正則
3: -f -d -e來判斷是否為檔案,為目錄,是否存在.
例子:
if ($remote_addr = 192.168.1.100) { return 403; }
if ($http_user_agent ~ MSIE) { rewrite ^.*$ /ie.htm; break; #(不break會迴圈重定向) }
if (!-e $document_root$fastcgi_script_name) { rewrite ^.*$ /404.html break; } 注, 此處還要加break, |
以 xx.com/dsafsd.html這個不存在頁面為例,
我們觀察訪問日誌, 日誌中顯示的訪問路徑,依然是GET /dsafsd.html HTTP/1.1
提示: 伺服器內部的rewrite和302跳轉不一樣.
跳轉的話URL都變了,變成重新http請求404.html, 而內部rewrite, 上下文沒變,
就是說 fastcgi_script_name 仍然是 dsafsd.html,因此 會迴圈重定向.
set 是設定變數用的, 可以用來達到多條件判斷時作標誌用.
達到apache下的 rewrite_condition的效果
如下: 判斷IE並重寫,且不用break; 我們用set變數來達到目的
if ($http_user_agent ~* msie) { set $isie 1; }
if ($fastcgi_script_name = ie.html) { set $isie 0; }
if ($isie 1) { rewrite ^.*$ ie.html; } |