An example of a complex two-way URL rewrite (TWURL)
search cancel

An example of a complex two-way URL rewrite (TWURL)

book

Article ID: 165354

calendar_today

Updated On:

Products

ProxySG Software - SGOS

Issue/Introduction

An example of a complex two-way URL rewrite (TWURL)
I have a complex TWURL that I need to perform.
Any traffic to a particular URL needs to be redirected internally.
Any traffic to a particular URL with "login" in the URL needs to be redirected externally
 

Resolution

There may be times where you need to create a complex TWURL, such as you want a login to go to a remote site, but something other than a login goes to an internal site.  This is a complex example of a TWURL rewrite.


Consider the case where :
    1. Client reaches public portal (http://192.0.2.50)
    2. The portal redirects to an internal server (http://192.0.2.1)
    3. This internal server redirects to another server (http://example.com/)
    4. This internal redirect should appear on the client as an external portal (http://192.0.2.50/login)
-OR-
    1. Whenever the client types in http://192.0.2.50/xxx (where xxx is not "login") then redirect to http://192.0.2.1
    2. Whenever the client types in http://192.0.2.50/login/xxx then redirect to example.com

CPL code:
define url_rewrite P3
    rewrite_url_prefix "http://192.0.2.50/login/" "http://example.com/"
    rewrite_url_prefix "http://192.0.2.50/" "http://192.0.2.1/"
end

;;;the above is the important part. The above code will check if the response from the server anywhere includes example.com, if ;;;it does it converts it to /login, else if there is a reply from server being 192.0.2.1  it converts to 192.0.2.50.

define action change1
    rewrite( url, "http://192.0.2.50/login/(.*)", "http://example.com/$(1)")
    transform P3
end

define action change2
    rewrite( url, "http://192.0.2.50/(.*)", "http://192.0.2.1/$(1)")
    transform P3
end

;;;the above code takes care of client -> internal server mapping. Note both point to same transform

define action force_uncompressed
    delete( request.header.Accept-Encoding )
end

<Proxy>
    url=http://192.0.2.50/login action.change1(yes)
    url=http://192.0.2.50/ action.change2(yes)

;;; the above code is only triggered with client -> internal server traffic, not vice versa
<Cache>
   action.force_uncompressed(yes)