Forum Discussion
21 Replies
- Thomas_GobetNimbostratus
Hi,
Here is the iRule you need :
when HTTP_REQUEST { if {([string tolower [HTTP::uri]] contains "/xyz") and [string to lower [HTTP::host]] equals "abc"}{ HTTP::redirect http://abc:40001; } }
- siyadh_121603NimbostratusHi Thomas, Thank you for your quick response. Is there missing any syntax...? Because we are not able to save it from iRule Editor (it shows red).
- Thomas_Gobet_91Cirrostratus
Hi,
Here is the iRule you need :
when HTTP_REQUEST { if {([string tolower [HTTP::uri]] contains "/xyz") and [string to lower [HTTP::host]] equals "abc"}{ HTTP::redirect http://abc:40001; } }
- siyadh_121603NimbostratusHi Thomas, Thank you for your quick response. Is there missing any syntax...? Because we are not able to save it from iRule Editor (it shows red).
- Thomas_GobetNimbostratus
I'm sorry typo mistake due to autocorrect... This is not "to lower" but "tolower".
Sorry.when HTTP_REQUEST { if {([string tolower [HTTP::uri]] contains "/xyz") and [string tolower [HTTP::host]] equals "abc"}{ HTTP::redirect http://abc:40001; } }
- siyadh_121603NimbostratusHi Thomas, Appreciated your quick reply. But it is redirecting to https and getting server error 404.
- LyonsG_85618CirrostratusYou may prefer to have: starts_with "/xyz" If you use contains iRule will check the whole URI for /xyz? i.e. it will not only match http://abc/xyz but also http://abc/123/456/xyz
- Thomas_Gobet_91Cirrostratus
I'm sorry typo mistake due to autocorrect... This is not "to lower" but "tolower".
Sorry.when HTTP_REQUEST { if {([string tolower [HTTP::uri]] contains "/xyz") and [string tolower [HTTP::host]] equals "abc"}{ HTTP::redirect http://abc:40001; } }
- siyadh_121603NimbostratusHi Thomas, Appreciated your quick reply. But it is redirecting to https and getting server error 404.
- LyonsG_85618CirrostratusYou may prefer to have: starts_with "/xyz" If you use contains iRule will check the whole URI for /xyz? i.e. it will not only match http://abc/xyz but also http://abc/123/456/xyz
- nitassEmployee
But it is redirecting to https and getting server error 404.
can you post the port 80 and port 40001 virtual servers and their pools configurations?
tmsh list ltm virtual (name) tmsh list ltm pool (name)
- siyadh_121603NimbostratusHi Nitass, Please find the below details. ------------------------------------------- 40001: ------------------------------------------- ltm virtual FIM_40001 { destination 172.16.215.32:40001 ip-protocol tcp mask 255.255.255.255 pool FIM_40001 profiles { tcp { } } source 0.0.0.0/0 translate-port disabled vlans-disabled } ltm pool FIM_40001 { members { 172.16.225.165:40001 { address 172.16.225.165 session monitor-enabled state up } 172.16.225.166:40001 { address 172.16.225.166 session user-disabled state up } } monitor gateway_icmp } ------------------------------------------- HTTP: ------------------------------------------- ltm virtual FIM_HTTP_http_virtual { app-service /Common/FIM_HTTP.app/FIM_HTTP destination /Common/172.16.215.32:http ip-protocol tcp mask 255.255.255.255 pool FIM_HTTP_pool profiles { /Common/tcp { } FIM_HTTP_http_profile { } } rules { /Common/FIM /Common/FIM-4001 /Common/FIM-4002 } source 0.0.0.0/0 vlans-disabled } ltm pool FIM_HTTP_pool { app-service /Common/FIM_HTTP.app/FIM_HTTP load-balancing-mode least-connections-member members { /Common/172.16.225.165:http { address 172.16.225.165 app-service /Common/FIM_HTTP.app/FIM_HTTP session monitor-enabled state up } /Common/172.16.225.166:http { address 172.16.225.166 app-service /Common/FIM_HTTP.app/FIM_HTTP session user-disabled state up } } monitor FIM_HTTP_http_monitor slow-ramp-time 300 }
- nitass_89166Noctilucent
But it is redirecting to https and getting server error 404.
can you post the port 80 and port 40001 virtual servers and their pools configurations?
tmsh list ltm virtual (name) tmsh list ltm pool (name)
- siyadh_121603NimbostratusHi Nitass, Please find the below details. ------------------------------------------- 40001: ------------------------------------------- ltm virtual FIM_40001 { destination 172.16.215.32:40001 ip-protocol tcp mask 255.255.255.255 pool FIM_40001 profiles { tcp { } } source 0.0.0.0/0 translate-port disabled vlans-disabled } ltm pool FIM_40001 { members { 172.16.225.165:40001 { address 172.16.225.165 session monitor-enabled state up } 172.16.225.166:40001 { address 172.16.225.166 session user-disabled state up } } monitor gateway_icmp } ------------------------------------------- HTTP: ------------------------------------------- ltm virtual FIM_HTTP_http_virtual { app-service /Common/FIM_HTTP.app/FIM_HTTP destination /Common/172.16.215.32:http ip-protocol tcp mask 255.255.255.255 pool FIM_HTTP_pool profiles { /Common/tcp { } FIM_HTTP_http_profile { } } rules { /Common/FIM /Common/FIM-4001 /Common/FIM-4002 } source 0.0.0.0/0 vlans-disabled } ltm pool FIM_HTTP_pool { app-service /Common/FIM_HTTP.app/FIM_HTTP load-balancing-mode least-connections-member members { /Common/172.16.225.165:http { address 172.16.225.165 app-service /Common/FIM_HTTP.app/FIM_HTTP session monitor-enabled state up } /Common/172.16.225.166:http { address 172.16.225.166 app-service /Common/FIM_HTTP.app/FIM_HTTP session user-disabled state up } } monitor FIM_HTTP_http_monitor slow-ramp-time 300 }
- LyonsG_85618Cirrostratus
Hi
Should redirect not be:
HTTP::redirect "http://abc:40001"
Graham
- nitass_89166Noctilucent
can you try to set event priority and disable all after redirection?
priority
https://devcentral.f5.com/wiki/iRules.priority.ashxevent disable
https://devcentral.f5.com/wiki/iRules.event.ashxe.g.
// config root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm virtual bar ltm virtual bar { destination 172.28.24.10:80 ip-protocol tcp mask 255.255.255.255 pool foo profiles { http { } tcp { } } rules { qux } source 0.0.0.0/0 source-address-translation { type automap } vs-index 63 } root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm rule qux ltm rule qux { when HTTP_REQUEST priority 100 { if { [HTTP::path] starts_with "/xyz" } { HTTP::redirect "http://[HTTP::host]:40001/" event disable all } } } root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm virtual bar40001 ltm virtual bar40001 { destination 172.28.24.10:40001 ip-protocol tcp mask 255.255.255.255 pool foo40001 profiles { tcp { } } source 0.0.0.0/0 source-address-translation { type automap } vs-index 64 } root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm pool foo40001 ltm pool foo40001 { members { 200.200.200.101:40001 { address 200.200.200.101 } } } // test [root@ve11a:Active:In Sync] config curl -IL http://172.28.24.10/xyz/something HTTP/1.0 302 Found Location: http://172.28.24.10:40001/ Server: BigIP Connection: Keep-Alive Content-Length: 0 HTTP/1.1 200 OK Date: Sat, 16 Aug 2014 08:24:04 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Sun, 09 Feb 2014 08:39:51 GMT ETag: "41879c-59-2a9c23c0" Accept-Ranges: bytes Content-Length: 89 Connection: close Content-Type: text/html; charset=UTF-8
- siyadh_121603NimbostratusHi Nitass, Thank you for your guidance and support. This iRules works fine when HTTP_REQUEST { if {([string tolower [HTTP::uri]] contains "/xyz") and [string tolower [HTTP::host]] equals "abc"}{ HTTP::redirect http://abc:40001; } }
- Thomas_GobetNimbostratusBe careful on using contains, LyonsG was right. You may prefere using starts_with instead of contains, you'll be sure that you won't have "false matches".
- nitassEmployee
can you try to set event priority and disable all after redirection?
priority
https://devcentral.f5.com/wiki/iRules.priority.ashxevent disable
https://devcentral.f5.com/wiki/iRules.event.ashxe.g.
// config root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm virtual bar ltm virtual bar { destination 172.28.24.10:80 ip-protocol tcp mask 255.255.255.255 pool foo profiles { http { } tcp { } } rules { qux } source 0.0.0.0/0 source-address-translation { type automap } vs-index 63 } root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm rule qux ltm rule qux { when HTTP_REQUEST priority 100 { if { [HTTP::path] starts_with "/xyz" } { HTTP::redirect "http://[HTTP::host]:40001/" event disable all } } } root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm virtual bar40001 ltm virtual bar40001 { destination 172.28.24.10:40001 ip-protocol tcp mask 255.255.255.255 pool foo40001 profiles { tcp { } } source 0.0.0.0/0 source-address-translation { type automap } vs-index 64 } root@(ve11a)(cfg-sync In Sync)(Active)(/Common)(tmos) list ltm pool foo40001 ltm pool foo40001 { members { 200.200.200.101:40001 { address 200.200.200.101 } } } // test [root@ve11a:Active:In Sync] config curl -IL http://172.28.24.10/xyz/something HTTP/1.0 302 Found Location: http://172.28.24.10:40001/ Server: BigIP Connection: Keep-Alive Content-Length: 0 HTTP/1.1 200 OK Date: Sat, 16 Aug 2014 08:24:04 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Sun, 09 Feb 2014 08:39:51 GMT ETag: "41879c-59-2a9c23c0" Accept-Ranges: bytes Content-Length: 89 Connection: close Content-Type: text/html; charset=UTF-8
- siyadh_121603NimbostratusHi Nitass, Thank you for your guidance and support. This iRules works fine when HTTP_REQUEST { if {([string tolower [HTTP::uri]] contains "/xyz") and [string tolower [HTTP::host]] equals "abc"}{ HTTP::redirect http://abc:40001; } }
- Thomas_GobetNimbostratusBe careful on using contains, LyonsG was right. You may prefere using starts_with instead of contains, you'll be sure that you won't have "false matches".