Forum Discussion

Village_Idiot's avatar
Village_Idiot
Icon for Nimbostratus rankNimbostratus
Nov 16, 2022

Capture part of URL to redirect to another

I have a request to redirect from one URL to another based on the word "LOAN" in the query part of the URL. They only want to keep a random length string from the old URL to the redirected one

Example

From

https://website1.domain.com/path/app.aspx?KT1112_0_0_0=38932940&KY108_0_0=LOAN&clienttype=html&cqid=102

To

https://website2.domain.com/path/app.aspx?acctNum=38932940&acctType=LOAN&type=Documents

In the examples, the only part needed to capture is "38932940" and use it as a variable in the redirected URL. The problem is this is random in length. Any ideas on how to achieve this?

  • Hello there,
    if the requested information is always stored in variable KT1112_0_0_0= at request time, this script will capture exact variable value (not bound to length) and insert it in redirect url as acctNum value

    when HTTP_REQUEST {
      if { [HTTP::uri] contains "LOAN" }{
        set acctNum [findstr [HTTP::query] "KT1112_0_0_0=" 13 &]
        HTTP::redirect "https://website2.domain.com/path/app.aspx?acctNum=$acctNum&acctType=LOAN&type=Documents"
    	}
    }

    It's working in my lab

  • Hi Village_Idiot , 
     > I have written an iRule script for you and tested it in my home Lab environment. 

    > First take the iRule : 

    when HTTP_REQUEST {
      if { [HTTP::uri] contains "LOAN"} {
      HTTP::redirect "https://website2.domain.com/path/app.aspx?acctNum=[URI::query https://website1.domain.com/path/app.aspx?KT1112_0_0_0=38932940&KY108_0_0=LOAN&clienttype=html&cqid=102 KT1112_0_0_0]&acctType=LOAN&type=Documents"
      }
    }
    
    #URI::query <uri> <parameter>    I used it to Get the numeric value from a specific parameter exists in first uri

    it should work with you as its as long you do not have any new parameters you want to add , it’s up to you. 
    > Read about [URI::query] Function which was my clue to get the desired output. 

    ___________________________________________________________________________
    Now , I will share a snap shots from my environment : 

      1- My irule which is adequate with my environment and published application : 

    2- URL before Redirection and fetching the parameter value , it "q" Parameter in my environment : 

    3- URL after Redirection and transfer the "q" value to be stored in parameter "acctNum": 

    as it is shown "acctNum" parameter has taken the "q" parameter value in the first request and Redirected to the second URL with the targgeted value. 

    hope it helps you. 
    Please test it and give me your feedback to save it in my notes if it matches your requirements as it is the first time to use [url::query] Function. 

    Regards
    Mohamed Kansoh

  • Hello there,
    if the requested information is always stored in variable KT1112_0_0_0= at request time, this script will capture exact variable value (not bound to length) and insert it in redirect url as acctNum value

    when HTTP_REQUEST {
      if { [HTTP::uri] contains "LOAN" }{
        set acctNum [findstr [HTTP::query] "KT1112_0_0_0=" 13 &]
        HTTP::redirect "https://website2.domain.com/path/app.aspx?acctNum=$acctNum&acctType=LOAN&type=Documents"
    	}
    }

    It's working in my lab

    • Village_Idiot's avatar
      Village_Idiot
      Icon for Nimbostratus rankNimbostratus

      This worked, but I had to make an adjustment to the findstr as it wasn't working. Here is the final iRule

      when HTTP_REQUEST {
        if { [HTTP::uri] contains "LOAN" }{
          set acctNum [findstr [HTTP::query] "=" 1 &]
          HTTP::redirect "https://website2.domain.com/path/app.aspx?acctNum=$acctNum&acctType=LOAN&type=Documents"
      	}
      }

      Thanks for the help!!

      • CA_Valli's avatar
        CA_Valli
        Icon for MVP rankMVP

        I was capturing the full query parameter and skipping the first 13 characters (param name + "=" character) in order just to keep the value. 

        Be careful with you syntax, because if another parameter is passed in querystring before acctNum value (like that LOAN that triggers the if condition) it might be captured instead. If param name is dynamic (eg. numbers change), you could also capture a "static" part and skip the dynamic pattern using an appropirate syntax. 

        [findstr [HTTP::query] "KT1112" 13 &] will match all of the following param names, and save the param value after the "=" and up to first "&" character:  

        KT1112_0_0_0=

        KT1112_1_2_3=

        KT1112aaaaaa=

        I really think you should configure the match to be as close as possible. 

        Regards

        CA