Nginx實戰(二) URL重寫

樑桂釗發表於2016-10-18

Nginx實戰系列目錄

Rewrite主要的功能就是實現URL的重寫,Nginx的Rewrite規則採用PCRE Perl相容正規表示式的語法規則匹配,如果需要Nginx的Rewrite功能,在編譯Nginx之前,需要編譯安裝PCRE庫。

通過Rewrite規則,可以實現規範的URL、根據變數來做URL轉向及選擇配置。

相關指令

if指令

語法:if(condition){…}

使用環境:server,location

該指令用於檢查一個條件是否符合,如果條件符合,則執行大括號內的語句。if指令不支援巢狀,不支援多個條件&&和||處理。

其中,condition中可以包含的判斷標識如下

  • ~為區分大小寫匹配
  • ~*為不區分大小寫匹配
  • !~區分大小寫不匹配
  • !~*不區分大小寫不匹配
  • -f和!-f用來判斷是否存在檔案
  • -d和!-d用來判斷是否存在目錄
  • -e和!-e用來判斷是否存在檔案或目錄
  • -x和!-x用來判斷檔案是否可執行

例如,示例,如果是IE瀏覽器就進行跳轉

if ($http_user_agent ~MSIE){  
  rewrite ^(.*)$/msie/$1 break;  
}

return指令

語法:return code

使用環境:server,location,if

該指令用於結束規則的執行並返回狀態嗎給客戶端。狀態碼包括:204(No Content)、400(Bad Request)、402(Payment Required)、403(Forbidden)、404(Not Found)、405(Method Not Allowed)、406(Not Acceptable)、408(Request Timeout)、410(Gone)、411(Length Required)、413(Request Entity Too Large)、416(Requested Range Not Satisfiable)、500(Internal Server Error)、501(Not Implemented)、502(Bad Gateway)、503(Service Unavailable)和504(Gateway Timeout)。

例如,示例,如果訪問的URL以.sh .bash 結尾,返回狀態碼403

location ~ .*\.(sh|bash)?$  
{  
  return 403;  
}

set指令

語法:set variable value

使用環境:server,location,if

該指令用於定義一個變數,並給變數賦值。

rewrite指令

語法:rewrite regex replacement flag

使用環境:server,location,if

該指令根據表示式來重定向URI,或者修改字串。

flag標記有:

  • last相當於Apache裡的[L]標記,表示完成rewrite
  • break終止匹配, 不再匹配後面的規則
  • redirect返回302臨時重定向 位址列會顯示跳轉後的地址
  • permanent返回301永久重定向 位址列會顯示跳轉後的地址

例如,示例,將www重定向到http://

if ($host ~* www\.(.*)){
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent;
}

使用案例

域名永久重定向

rewrite ^(.*)$  http://blog.720ui.com permanent;

當訪問的檔案和目錄不存在時,重定向到某個html檔案

if ( !-e $request_filename ){
  rewrite ^/(.*)$ error.html last;
}

訪問目錄跳轉

將訪問/b跳轉到/bbs目錄上去

rewrite ^/b/?$ /bbs permanent;

目錄對換

/123456/xxxx  ====>   /xxxx?id=123456
rewrite ^/(d+)/(.+)/  /$2?id=$1 last;

根據不同的瀏覽器將得到不同的結果。

if ($http_user_agent ~ Firefox) {  
   rewrite ^(.*)$ /firefox/$1 break;  
}  

if ($http_user_agent ~ MSIE) {  
   rewrite ^(.*)$ /msie/$1 break;  
}  

if ($http_user_agent ~ Chrome) {  
  rewrite ^(.*)$ /chrome/$1 break;  
}

防止盜鏈

根據Referer資訊防止盜鏈

location ~*\.(gif|jpg|png|swf|flv)${  
  valid_referers none blocked www.cheng.com*.test.com;  
  if ($invalid_referer)  
    rewrite ^/(.*) http://www.lianggzone.com/error.html           
}

禁止訪問以/data開頭的檔案

location ~ ^/data
{
  deny all;
}

禁止訪問以.sh,.exe為檔案字尾名的檔案

location ~ .*\.(sh|exe)?$  
{  
  return 403;  
}

設定某些型別檔案的瀏覽器快取時間

location ~ .*.(gif|jpg|jpeg|png|bmp)$
{
  expires 30d;
}

location ~ .*.(js|css)$
{
  expires 1h;
}

設定過期時間並不記錄404錯誤日誌

favicon.ico和robots.txt設定過期時間,為favicon.ico為99天,robots.txt為7天並不記錄404錯誤日誌。

location ~(favicon.ico) {
  log_not_found off;
  expires 99d;
  break;
}

location ~(robots.txt) {
  log_not_found off;
  expires 7d;
  break;
}

設定過期時間並不記錄訪問日誌

設定某個檔案的過期時間;這裡為600秒,並不記錄訪問日誌

location ^~ /html/scripts/loadhead_1.js {
  access_log   off;
  root /opt/lampp/htdocs/web;
  expires 600;
break;
}

相關文章