Forum Discussion
Redirect URIs in datagroup to dedicated node
Hi
Could you help identify why I get the following error below when applying this irule.
ERROR =====================================
:9: error: ["wrong # of arguments"][class match -value $request_uri equals_any -case_sensitive [class lookup $datagroup_name]]
The aim is to send specific requests to a dedicated node "1.2.2.2" in pool "myprodpool" that match a URI list datagroup "ACL_webforms" . This must also maintain sticky persistence cookie on this node. So when request that contain URIs in datagroup, send to node 1.2.2.2 with cookie persistence
The irule below gives this error
set is_match [class match -value $request_uri equals_any -case_sensitive [class lookup $datagroup_name]]
IRULE ==============================
when HTTP_REQUEST {
# Define the name of your data group containing the URIs
set datagroup_name "ACL_Intranett-webforms"
# Get the request URI
set request_uri [HTTP::uri]
# Check if the request URI matches any entry in the data group
set is_match [class match -value $request_uri equals_any -case_sensitive [class lookup $datagroup_name]]
if { $is_match } {
# Set the node to your specific IP address
set node_ip "1.2.2.2"
# Set the persistence cookie name
set persistence_cookie_name "sticky_cookie_name"
# Check if the persistence cookie exists
set cookie_value [HTTP::cookie $persistence_cookie_name]
if { $cookie_value eq "" } {
# If the cookie doesn't exist, create and set the cookie
set cookie_value [IP::client_addr]
HTTP::cookie insert $persistence_cookie_name $cookie_value
}
# Set the persistence based on the cookie
persist uie cookie $persistence_cookie_name
pool $node_ip
return
}
}
southern_nordic For various reasons you should try not to send traffic to a specific node and instead you should create a pool for this single node and reference that pool instead. I believe the following will correct your error as well as send traffic to a pool with just the single node in it rather than referencing the node by itself. This iRule also assumes you have a default pool configured on the VS and will send traffic to that pool if it doesn't match the data-group list.
when CLIENT_ACCEPTED priority 500 { set DEFAULT_POOL [LB::server pool] } when HTTP_REQUEST priority 500 { # Get the request URI set request_uri [HTTP::uri] # Check if the request URI matches any entry in the data group if { [class match -- ${request_uri} == ACL_Intranett-webforms] } { # Set the persistence cookie name set persistence_cookie_name "stick_cookie_name" # Check if the persistence cookie exists set cookie_value [HTTP::cookie ${persistence_cookie_name}] if { ${cookie_value} == "" } { # If the cookie doesn't exist, create and set the cookie set cookie_value [IP::client_addr] HTTP::cookie insert ${persistence_cookie_name} ${cookie_value} } # Set the persistence based on the cookie persist uie cookie ${persistence_cookie_name} pool POOL_ACL_Intranett_Webforms } else { pool ${DEFAULT_POOL} } }
- southern_nordicAltocumulus
Thanks Paulios, I should have mentioned we have a default pool and I had intended to create a seperate pool for this traffic.
I applied your irule , however I received the following error
01070151:3: Rule 13: error: ["== is unexpected; it should be one of 'contains ends_with equals starts_with'"][class match -- ${request_uri} == ACL_Intranett-webforms]southern_nordic It looks like class match doesn't like using "==" and instead wants "eq" which I have corrected below.
when CLIENT_ACCEPTED priority 500 { set DEFAULT_POOL [LB::server pool] } when HTTP_REQUEST priority 500 { # Get the request URI set request_uri [HTTP::uri] # Check if the request URI matches any entry in the data group if { [class match -- ${request_uri} eq ACL_Intranett-webforms] } { # Set the persistence cookie name set persistence_cookie_name "stick_cookie_name" # Check if the persistence cookie exists set cookie_value [HTTP::cookie ${persistence_cookie_name}] if { ${cookie_value} == "" } { # If the cookie doesn't exist, create and set the cookie set cookie_value [IP::client_addr] HTTP::cookie insert ${persistence_cookie_name} ${cookie_value} } # Set the persistence based on the cookie persist uie cookie ${persistence_cookie_name} pool POOL_ACL_Intranett_Webforms } else { pool ${DEFAULT_POOL} } }
The irule now compiles with no errors. However when I generate traffic I see the following error in the logs:
ERR_ARG (line 1) invoked from within "HTTP::cookie insert ${persistence_cookie_name} ${cookie_value}"
I guess it is having trouble when executing the cookie insert as result persistence is not honouredsouthern_shredd You might try the following.
when CLIENT_ACCEPTED priority 500 { set DEFAULT_POOL [LB::server pool] } when HTTP_REQUEST priority 500 { # Get the request URI set request_uri [HTTP::uri] # Check if the request URI matches any entry in the data group if { [class match -- ${request_uri} eq ACL_Intranett-webforms] } { # Set the persistence cookie name set persistence_cookie_name "stick_cookie_name" # Check if the persistence cookie exists set cookie_value [HTTP::cookie ${persistence_cookie_name}] if { ${cookie_value} == "" } { # If the cookie doesn't exist, create and set the cookie set cookie_value [IP::client_addr] HTTP::cookie insert name ${persistence_cookie_name} value ${cookie_value} path "/" } # Set the persistence based on the cookie persist uie cookie ${persistence_cookie_name} pool POOL_ACL_Intranett_Webforms } else { pool ${DEFAULT_POOL} } }
Apologies for the late response here.
I have applied the irule above and while the irule did not give any errors, the webform still produces an error due to a "persistence" type error. When we run a test we see the requests to still changing servers.
The webpage is a webform that is filled in and submitted and before submition but before submitio a verification process checks if the server that received the Submitted form is the same servers that loaded up the webform. This continues to give an error. I even tried to match just the URI without the "datagroup" by using the hostname, URI and persistence but the website still fails the "persistence" test.Are there any recommendations on how to update this irule to specifically match traffic from hostname "demo.technical.olive.com" and URI "/object.php?categoryID=3453" and send this traffic to pool "ACL_Intranett_Webforms" with persistence cookie? The rest of the traffic can default to the virtual server pool.
The main aim to match all URIs in teh datagroup but for now I would like to test the hostname and URI firstsouthern_shredd Do these users hit multiple paths on this same VS? If the answer is yes, try configuring a /32 OneConnect profile and see if your issue persists.
Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com