Forum Discussion

Bob_10976's avatar
Bob_10976
Icon for Nimbostratus rankNimbostratus
May 12, 2008

iRule re-write to replace ISAPI re-write

Hello all...

 

 

We are currently using ISAPI re-write in our portal to re-write uri's to the appropriate location. With the help of this forum I came up with the following, which works fine for /Portal/Category/

 

 

when HTTP_REQUEST {

 

if { [HTTP::uri] starts_with "/Portal/Category/" } {

 

HTTP::uri "/g2p/KII.G2P.Portal.Web.Pages/Category.aspx?id=[substr [HTTP::uri] 17 "\/"] "

 

}

 

}

 

 

But my issue is that I have a hundreds of entries in my ISAPI file and not all of them are /portal/category/ some do have the /portal/"somthing differnet", some have a different somthing/something. Obviously I don’t want to create hundreds of iRules or an iRule that has hundreds of “if then else” statements. Does anyone have any other suggestion or thoughts.

 

 

Below is a small example of some of the rewrites in my ISAPI file:

 

 

RewriteCond Host: test.mysite.com

 

RewriteRule /Portal/Search\.aspx(.*) /g2p/file.G2P.Portal.Web.Pages.Google/Search.aspx$1 [I]

 

 

RewriteCond Host: test.mysite.com

 

RewriteRule /Portal/SearchProxy\.aspx(.*) /g2p/file.G2P.Portal.Web.Pages.Google/SearchProxy.aspx$1 [I]

 

 

RewriteCond Host: test.mysite.com

 

RewriteRule /Portal/etc/(.*) /g2p/file.G2P.Portal.Web.Pages.Google/etc/$1 [I]

 

 

RewriteCond Host: test.mysite.com

 

RewriteRule /Portal/ExternalLink\.aspx(.*) /g2p/KII.G2P.Portal.Web.Pages/ExternalLink.aspx$1 [I]

 

 

RewriteCond Host: www\.test\.mayor\.state\.com

 

RewriteHeader Host: .* mayor\.state\.com

 

 

RewriteCond Host: test\.mayor\.state\.com

 

RewriteHeader Host: .* mayor\.state\.com

 

 

RewriteCond Host: cms\.test\.state\.mayor\.com

 

RewriteHeader Host: .* mayor\.state\.com

 

 

RewriteCond Host: test\.agency\.state\.com

 

RewriteHeader Host: .* agency\.state\.com

 

 

RewriteCond Host: www\.test\.agency\.state\.com

 

RewriteHeader Host: .* agency\.state\.com

 

 

RewriteCond Host: test\.cms\.agency\.state\.com

 

RewriteHeader Host: .* agency\.state\.com

 

 

RewriteCond Host: test\.another_agency\.state\.com

 

RewriteHeader Host: .* commerce\.state\.com

 

 

RewriteCond Host: www\.test\.another_agency \.state\.com

 

RewriteHeader Host: .* another_agency\.state\.com

 

 

RewriteCond Host: cms\.test\.another_agency \.state\.com

 

RewriteHeader Host: .* another_agency\.state\.com

 

 

 

Thanks in advance…

 

 

Bob

 

  • Hi Joe,

     

     

    We have more than one sites share the same IP. for the site level monitoring, I use one VS with the iRules, check the site header to different pool.

     

    the question: Does F5 know where is www.mycompany.com? since mycompany.com and www.mycompany.com are all inside of the network. they are using internal IP.

     

    We add the dns record in the local hosts file to let server know where is the site, how about F5?

     

     

    many thanks,

     

     

    Xin
  • Hi Xin,

     

     

    Can you elaborate on your question? LTM typically doesn't deal with DNS resolution. If the hostnames resolve to the VIP address (or an IP address which is NAT'd to the VIP address), the request will get to LTM. LTM won't do hostname to IP address resolution unless you specifically configure this using NAME:: commands in an iRule (Click here).

     

     

    You're specifying where to send requests based on the Host header value in the client request. So you're controlling where the request is sent based on the requested hostname. This is independent of DNS name resolution.

     

     

    Aaron
  • Hi Joe/Aaron,

     

     

    I tired Joe's code and it doesn't work this time. btw, I have used Joe's other code before and it works fine.

     

     

    What we need it is, there is a web site has two URLs, one with www, and one without www. such as www.mycompany.com and mycompany.com or www.xin.com and xin.com. The web site is working with both URLs. We have asked for any user doesn't matter he use which URL, it should always return the URL with www included the bookmarks he made without www. There are more than one way to do it, I am trying to use the iRules. Can I modify HTTP::host? if we can modify it, all we need is to check the HTTP::host and adding the www if it has no www. Or we can not do this way, we have to redirect the request back to the user with www.

     

     

    From Joe's code, redirect to "http://www.mycompany.com[HTTP::uri]", can this request sent to any pool in LTM?

     

    do you mean this?

     

     

    when HTTP_REQUEST {

     

    switch [string tolower [HTTP::host]] {

     

    "www.mycompany.com" {

     

    pool pl_www_mycompany_com

     

    }

     

    "mycompany.com" {

     

    HTTP::redirect "http://www.mycompany.com[HTTP::uri]"

     

    pool pl_www_mycompany_com

     

    }

     

    default {

     

    reject

     

    }

     

    }

     

    }

     

     

     

    thanks,

     

     

    Xin

     

  • hi Joe,

     

     

    Your code works, just get what I need. thank you very much. I was using the iRules incorrectly before..

     

     

    Xin