For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

Forum Discussion

Muhannad's avatar
Muhannad
Icon for Cirrus rankCirrus
Oct 17, 2022
Solved

Rewrite Subdomain

Dears,

I am wondering about an efficient procedure to search and replace a specific Subdomain in the HOST, What i want to achieve is rewrite the HTTP request toward the server side as follows:

Client Request: DIRx.Clust1.Domain.com ----Should be forwarded to server side as follows:--- DIRx.Clust2.Domain.com, Only rewrite the Clust1 to Clust2 in the HOST, noting that the x value is variable DIRx and keep changing so i am unable to achieve the rewrite by simple Rule to replace the whole domain, i want to have a universal rule that can match the DIR# and copy it successfully to the domain when the rewrite happened.

Please can you guide me if there is any useful workaround.

Regards,

Muhannad

  • Code above is case sensitive on HTTP::host match. 

    If you want a case-insensitive match you can run this instead

    when HTTP_REQUEST {
    #    log local0. "Client requested host: [HTTP::host]"
      if { [string tolower [HTTP::host]] starts_with "dir" && [string tolower [HTTP::host]] contains "clust1" }{
        HTTP::header replace Host [string map {"clust1" "clust2"}[string tolower [HTTP::host]]]
    #        log local0. "Modified host: [HTTP::host]"
      }
    }

     

    Oct 17 15:43:07 bigip info tmm7[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Client requested host: DIR000.Clust1.Domain.com
    Oct 17 15:43:07 bigip info tmm7[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Modified host: dir000.clust2.domain.com

6 Replies

  • when HTTP_REQUEST {
      if { [HTTP::host] starts_with "DIR" && [HTTP::host] contains "Clust1" }{
      HTTP::header replace Host [string map {"Clust1" "Clust2"}[HTTP::host]]
      }
    }

     

    Sample execution logs: 

    Oct 17 15:32:37 bigip info tmm[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Client requested host: DIRx.Clust1.Domain.com
    Oct 17 15:32:37 bigip info tmm[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Modified host: DIRx.Clust2.Domain.com
    Oct 17 15:32:41 bigip info tmm6[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Client requested host: DIRy.Clust1.Domain.com
    Oct 17 15:32:41 bigip info tmm6[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Modified host: DIRy.Clust2.Domain.com
    Oct 17 15:32:43 bigip info tmm6[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Client requested host: DIRz.Clust1.Domain.com
    Oct 17 15:32:43 bigip info tmm6[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Modified host: DIRz.Clust2.Domain.com

     

    • CA_Valli's avatar
      CA_Valli
      Icon for MVP rankMVP

      Code above is case sensitive on HTTP::host match. 

      If you want a case-insensitive match you can run this instead

      when HTTP_REQUEST {
      #    log local0. "Client requested host: [HTTP::host]"
        if { [string tolower [HTTP::host]] starts_with "dir" && [string tolower [HTTP::host]] contains "clust1" }{
          HTTP::header replace Host [string map {"clust1" "clust2"}[string tolower [HTTP::host]]]
      #        log local0. "Modified host: [HTTP::host]"
        }
      }

       

      Oct 17 15:43:07 bigip info tmm7[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Client requested host: DIR000.Clust1.Domain.com
      Oct 17 15:43:07 bigip info tmm7[11345]: Rule /Common/test-iRule <HTTP_REQUEST>: Modified host: dir000.clust2.domain.com