Saturday, March 16, 2013

F5 Bigip Örnek(Example) Irules


F5 Irule örnekleri ;

Not: Domain adları atmasyondur, domain isimlerini ve urileri değiştirdim.

Rule - 1
*********************************************************************************
User-Agent'a göre ayrı pool

when HTTP_REQUEST {
  if { [HTTP::header User-Agent] contains "Chrome" } {
    pool xyz_Chrome
#Log gerekirse alttaki diez uçar.
#log local0. "Chrome Redirected: [HTTP::header "User-Agent"] Chrome Redirected"
  } else {
    pool xyz_Pool
  }
}

*********************************************************************************

Rule - 2
*********************************************************************************
Uri'ye göre pool switch

when HTTP_REQUEST {
  switch [HTTP::host] {
    "www.xyz.com"
{
      switch -glob [HTTP::uri] {
        "/images/*"  { pool xyz_img }
       }
     }
   }
}

*********************************************************************************


Rule - 3 & 4
*********************************************************************************
Vserver'a default pool assign edilmediği durumlarda direkt irule ile çalışmak. Backside http pooluna. örneklerde.

#Http Rule http vserver'a
when HTTP_REQUEST {
 switch [HTTP::host] {
  "xyz.com" { HTTP::redirect http://www.xyz.com[HTTP::uri] }
  "www.xyz.com" { pool xyz_pool }
 }
}

#Https Rule ssl vserver'a
when HTTP_REQUEST {
 switch [HTTP::host] {
  "xyz.com" { HTTP::redirect https://www.xyz.com[HTTP::uri] }
  "www.xyz.com" { pool xyz_pool }
 }
}
*********************************************************************************

Rule - 5
*********************************************************************************
Uri string ile başlayana redirect. Not: Bunun önünde domain adlarını www subdomain'ına redirect eden başka bir rule var. Ondan pass edip buna gelir

when HTTP_REQUEST {
    if { [HTTP::host] equals "www.xyz.com" and [HTTP::uri] starts_with "/odeme" } {
        HTTP::redirect "https://www.xyz.com/odeme"
    }
}
*********************************************************************************

Rule - 6
*********************************************************************************
Static Content caching header manipülasyon rule, ayrıca static content type class larda gif,jpg,png gibi file type tanımlamaları gerektirir. Detaylandırılır, diğer http header cache paramları ile daha iyidir. Lakin google chrome rfc de ister.! Hatada uzun cacheler bağışlamaz. 
Not: Cache-control param yoksada ekler belirtilen filetypelara göre.

when HTTP_RESPONSE {
if {[matchclass [HTTP::header Content-Type] equals static_content_types_class]}{
HTTP::header replace "Cache-Control" "max-age=354600"
}
}
*********************************************************************************

Rule - 7
*********************************************************************************
Maintenance Page redirect, ana poolda member kalmazsa maintenance pool'a dispatch eder ayrıca bu sırada google bot gelirse 503 aldığından sayfayı indexlemez sonra tekrar crawl edecektir.

when HTTP_REQUEST {
    if {[active_members xyz_pool] < 1}{
pool Maintenance_Pool
   }
if {[HTTP::header "User-Agent"] contains "Googlebot"} {
HTTP::respond 503
}
}
*********************************************************************************

Rule - 8
*********************************************************************************
Spesifik Vserverlar için http logging ayrıca remote syslog sunucusuna (11.11.11.11) loglatılacak şekilde; Genelde geçici olarak kullanıyoruz.
Lakin clone pool özelliği ile zaten herşeyi izliyorum.

when HTTP_REQUEST {
   set http_request "\"[HTTP::method] [HTTP::uri] HTTP/[HTTP::version]\""
   set http_request_time [clock clicks -milliseconds]
   set http_user_agent "\"[HTTP::header User-Agent]]\""
   set http_host [HTTP::host]
   set http_username [HTTP::username]
   set client_ip [IP::remote_addr]
   set client_port [TCP::remote_port]
   set http_request_uri [HTTP::uri]
   set referer [HTTP::header value referer]
}
when HTTP_RESPONSE {
   set response_time [expr [clock clicks -milliseconds] - $http_request_time]
   set virtual [virtual]
   set content_length 0
   if { [HTTP::header exists "Content-Length"] } {
      set content_length [HTTP::header "Content-Length"]
   }
   set lb_server "[LB::server addr]:[LB::server port]"
   if { [string compare "$lb_server" ""] == 0 } {
      set lb_server ""
   }
   set status_code [HTTP::status]
   set content_type [HTTP::header "Content-type"]
   set log_msg ""
   append log_msg "virtual=$virtual "
   append log_msg "client_ip=$client_ip "
   append log_msg "client_port=$client_port "
   append log_msg "lb_server=$lb_server "
   append log_msg "host=$http_host "
   append log_msg "username=$http_username "
   #append log_msg "$http_request_uri "
   append log_msg "request=$http_request "
   append log_msg "server_status=$status_code "
   append log_msg "content_type=$content_type "
   append log_msg "content_length=$content_length "
   append log_msg "resp_time=$response_time "
   append log_msg "user_agent=$http_user_agent "
   append log_msg "referer=$referer"
   log 11.11.11.11 local0. $log_msg
#Üsttekini diezler alttakini kaldırırsan lb diskine locale loglar.
#   log local0.info $log_msg
}
*********************************************************************************

Rule - 9
*********************************************************************************
302 yerine 301 ile redirect keza google v.b. arama motorları buna göre indexlemesi için. F5'De default redirect behaviour 302 dir.

when HTTP_REQUEST {
  if {
    ([HTTP::host] equals "f.xyz.com")
  } then {
      HTTP::respond 301 Location https://f.xyz.com[HTTP::uri]
    }
  }

*********************************************************************************

Rule - 10
*********************************************************************************
1 ip ile setli vserver üstünden birçok contenti yakın site çalıştırılması ve bunların kullandıkları bazı urilerin poollara ayrılarak
yükdengesi sağlanması ayrıca, bazı uri leri ilede redirect yapılması için kullanılan rule

 when HTTP_REQUEST {
  switch [HTTP::host] {
    "www.abc.net"
  - "www.an.net"
  - "www.sasa.net"
  - "www.dass.net"
  - "www.ma11.net"
  - "www.edas.com"
  - "www.d11.net"
  - "www.zz.net"
  - "www.xx.net"
  - "www.yy.net"
  - "www.dd.net"
      switch -glob [HTTP::uri] {
        "/0/service*" { HTTP::respond 301 Location "http://www.abc.net" [HTTP::uri] }
        "/1/*" { pool 1 }
        "/2/*" { pool 2 }
        "/3/*" { pool 3 }
        "/4/*" { pool 4 }
        "/5/*" { pool 5 }
        "/6/*" { pool 6 }
        "/7/*" { pool 7 }
        "/8/*" { pool 8 }
        "/9/*" { pool 9 }
        "/10/*" { pool 10 }
        "/11/*" { pool 11 }
        "/12/*" { pool 12 }
        "/13/*" { pool 13 }
        "/14/*" { pool 14 }
        "/15/*" { pool 15 }
        "/16/*" { pool 16 }
        "/17/*" { pool 17 }
        "/iletisim/*" { HTTP::respond 301 Location "http://www.sirket.com" [HTTP::uri] }
        }
     }
   }
}

*********************************************************************************

Rule - 11 & 12
*********************************************************************************
Bazı uri ve dosya formatları için 2 rule'da match ise http'den çağrılıp uri match ise https'e , https'den çağrıldığındada uri
match değil ise http'ye şeklinde incelenince daha iyi anlaşılır.

#Http to Https Rule; (Http vserver'a bindlı)

when HTTP_REQUEST {
  if {
    ([HTTP::host] equals "www.zzy.com")
  } then {
    if {
      ([HTTP::uri] contains "/si.aspx") ||
      ([HTTP::uri] contains "/si1.aspx") ||
      ([HTTP::uri] contains "/si2.aspx") ||
      ([HTTP::uri] contains "/si3.aspx") ||
      ([HTTP::uri] contains "/si4.aspx") ||
      ([HTTP::uri] contains "/sison.aspx") ||
      ([HTTP::uri] contains "/repas.aspx") ||
      ([HTTP::uri] contains "/uy") ||
      ([HTTP::uri] contains "/bi") ||
      ([HTTP::uri] contains "/bo") ||
      ([HTTP::uri] contains "/mait") ||
      ([HTTP::uri] contains "/mait2") ||
      ([HTTP::uri] contains "/gi") ||
      ([HTTP::uri] contains "/fb/test1.aspx") ||
      ([HTTP::uri] contains "/giit") ||
      ([HTTP::uri] contains "/admin/index.aspx")   ||
      ([HTTP::uri] contains "/WebResource.axd")
      } then {
      HTTP::respond 301 Location https://www.zzy.com[HTTP::uri]
    }
  }
}

#Https to http (Https vserver'a bindlı)
when HTTP_REQUEST {
  if {
    ([HTTP::host] equals "www.zzy.com")
  } then {
    if {
      not ([HTTP::uri] ends_with ".jpg") &&
      not ([HTTP::uri] ends_with ".gif") &&
      not ([HTTP::uri] ends_with ".png") &&
      not ([HTTP::uri] ends_with ".swf") &&
      not ([HTTP::uri] ends_with ".js") &&
      not ([HTTP::uri] ends_with ".css") &&
      not ([HTTP::uri] ends_with ".axd") &&
      not ([HTTP::uri] contains "/si.aspx") &&
      not ([HTTP::uri] contains "/si1.aspx") &&
      not ([HTTP::uri] contains "/si2.aspx") &&
      not ([HTTP::uri] contains "/si3.aspx") &&
      not ([HTTP::uri] contains "/si4.aspx") &&
      not ([HTTP::uri] contains "/sison.aspx") &&
      not ([HTTP::uri] contains "/repas")  &&
      not ([HTTP::uri] contains "/uy") &&
      not ([HTTP::uri] contains "/bi") &&
      not ([HTTP::uri] contains "/interactive/getlogininfo.aspx") &&
      not ([HTTP::uri] contains "/bo") &&
      not ([HTTP::uri] contains "/mait") &&
      not ([HTTP::uri] contains "/mat2") &&
      not ([HTTP::uri] contains "/gi") &&
      not ([HTTP::uri] contains "/giit") &&
      not ([HTTP::uri] contains "/fb/test1.aspx") &&
      not ([HTTP::uri] contains "/admin/index.aspx") &&
      not ([HTTP::uri] contains "/WebResource.axd")
    } then {
      HTTP::respond 301 Location http://www.zzy.com[HTTP::uri]
    }
  }
}
*********************************************************************************


No comments:

Post a Comment