Technical Forum
Ask questions. Discover Answers.
cancel
Showing results for 
Search instead for 
Did you mean: 
Custom Alert Banner

Cookie persistence

Ian_J_37801
Nimbostratus
Nimbostratus
Hi,

 

 

I am using cookie persistence to load balance some web servers. So far so good!

 

 

What happens though is the BigIP adds the cookie to the end of the cookie list as shown below:

 

 

HTTP/1.1 200 OK

 

Date: Mon, 25 Feb 2008 12:31:16 GMT

 

Server: Apache

 

Set-Cookie: PHPSESSID=7f596726c038e1a8773e86af878e438c; path=/; domain=.xyz.com

 

Expires: Thu, 19 Nov 1981 08:52:00 GMT

 

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

 

Pragma: no-cache

 

Set-Cookie: familyFilter=5; path=/; domain=.xyz.com

 

Set-Cookie: User=%7B%22LEID%22%3A356%2C%22LangID%22%3A%22en%22%2C%22sessionSaver%22%3A%22%22%2C%22sessionsCounter%22%3A1%7D; expires=Sat, 23-Feb-2013 12:31:16 GMT; path=/; domain=.xyz.com

 

Set-Cookie: User=%7B%22LEID%22%3A356%2C%22LangID%22%3A%22en%22%2C%22sessionSaver%22%3A%22%22%2C%22sessionsCounter%22%3A1%2C%22rC%22%3A%7B%22today%22%3A1%7D%7D; expires=Sat, 23-Feb-2013 12:31:17 GMT; path=/; domain=.xyz.com

 

Set-Cookie: md=%7B%22LEID%22%3A356%2C%22langID%22%3A%22en%22%2C%22visitID%22%3A%222f516862574db006fc4acc32fa151d2d%22%2C%22pve%22%3A1%2C%22sessionsCounter%22%3A1%2C%22filters%22%3A5%2C%22countryCode%22%3A%22GB%22%2C%22headerLangID%22%3A%22en%22%2C%22userLocations%22%3A%5B242%5D%2C%22userLanguages%22%3A%5B9%5D%7D; expires=Sat, 23-Feb-2013 12:31:17 GMT; path=/; domain=.xyz.com

 

Vary: Accept-Encoding,User-Agent

 

Content-Type: text/html

 

Set-Cookie: BIGipServerDSA_WWW_3.32.1.2=27462211112.20480.0000; path=/

 

Content-Encoding: gzip

 

Transfer-Encoding: chunked

 

 

Unfortunately, my application needs to have this returned at the beginning of the "Set-Cookie" list as the application also queries the cookie. Is there anyway to add the LTM cookie in forst rather than last?

 

 

Many thanks

 

 

Ian

 

 

 

4 REPLIES 4

hooleylist
Cirrostratus
Cirrostratus
Headers (including the Set-Cookie header) are generally added to the end of the existing headers. If you want to change the order of the cookies in responses, I think you'd need to save each Set-Cookie header value in an array, remove the header and then re-insert each of the headers in your required order. This could be a bit resource intensive to do for every response.

 

 

Can the app be modified to parse the cookie headers anywhere in the list of headers? If so, that would be the most efficient fix.

 

 

If you do need to use an iRule to do this, what version are you running? The reason I ask is that the handling of multiple headers of the same name was changed in 9.4.0.

 

 

Aaron

hooleylist
Cirrostratus
Cirrostratus
Actually, it looks like you're using a session based persistence cookie. The BIG-IP should only set this once per client session. So it might not actually be too resource intensive to check for the BIG-IP persistence cookie and only reorder the Set-Cookie headers if the BIG-IP persistence cookie is present.

 

 

Are you running 9.4.0 or higher?

 

 

Aaron

Ian_J_37801
Nimbostratus
Nimbostratus
Hi Aaron,

 

 

Many thanks for the response.

 

 

I am using 9.4.3

 

 

Regards

 

 

Ian

 

hooleylist
Cirrostratus
Cirrostratus
Hello Ian,

I was thinking that you'd need to use an array, but that assumed that you could delete one header at a time. The HTTP::header remove command deletes all headers of that name though. So I used a list instead.

Can you give this a shot?


when RULE_INIT {
    Set the name of the cookie to re-order the Set-Cookie headers for
   set ::bigip_persist_cookie_name "BIGipServerDSA_WWW_3.32.1.2"
   set ::bigip_persist_cookie_name "lastcookie"
    Log debug messages (to /var/log/ltm)?  0=no, 1=yes.
   set ::set_cookie_reorder_debug 1
}
when HTTP_RESPONSE {
    Check if the response contains the BIG-IP persistence cookie
   if {[HTTP::cookie exists $::bigip_persist_cookie_name]}{
      if {$::set_cookie_reorder_debug}{log local0. "Found persist cookie.  Re-ordering Set-Cookie headers"}
       Save the Set-Cookie header values to a list
      set set_cookie_values [HTTP::header values Set-Cookie]
      if {$::set_cookie_reorder_debug}{log local0. "Values: $set_cookie_values"}
       Remove the headers
      HTTP::header remove Set-Cookie
       Get the list index of the BIG-IP cookie's Set-Cookie header
      set bigip_cookie_index [lsearch -glob $set_cookie_values ${::bigip_persist_cookie_name}*]
      if {$::set_cookie_reorder_debug}{log local0. "BIG-IP cookie index: $bigip_cookie_index"}
       Add back the BIG-IP cookie set-Cookie header first
      HTTP::header insert Set-Cookie [lindex [lrange $set_cookie_values $bigip_cookie_index [expr $bigip_cookie_index + 1]] 0]
      if {$::set_cookie_reorder_debug}{log local0. "Inserted BIG-IP cookie: [lindex [lrange $set_cookie_values $bigip_cookie_index [expr $bigip_cookie_index + 1]] 0]"}
       Add back all Set-Cookie values except the BIG-IP cookie
      for {set i 0} {$i < [llength $set_cookie_values]}{incr i}{
          Check that this isn't the BIG-IP cookie Set-Cookie value 
         if {$i != $bigip_cookie_index}{
     Insert the header
    HTTP::header insert Set-Cookie [lindex [lrange $set_cookie_values $i [expr $i + 1]] 0]
    if {$::set_cookie_reorder_debug}{log local0. "Inserting: [lindex [lrange $set_cookie_values $i [expr $i + 1]] 0]"}
         } 
      }
       Clear the list of saved headers
      unset set_cookie_values
   }
}

Aaron