Using URL Rewrite to change part of URL - iis

I'm trying to use an URL Rewrite on an IIS 8.0 to rewrite existing URL:s on a developer machine. The reason for this is that I don't want to change existing (old) code.
What I'm trying to achieve is to change the following code in the response stream:
Foo Page
into:
Foo Page
But when I'm trying, I end up with:
Foo Page
And as you all know, this is not a very satisfying result.
So - how do I do this rewrite proper to achieve what I'm trying to do?
I know there are better ways of doing this, using application variables etc., but it's an old solution and I don't want to mess too much with the application itself. I want to keep the changes to a minimum. At least to begin with.
The rules I tried look like this:
<system.webServer>
<rewrite>
<outboundRules>
<rule name="foo.com" enabled="true">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="foo.com" />
<action type="Rewrite" value="foo.localhost" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
I guess there is some regex magic I should be using.

Your rule needs to be changed to:
<rule name="foo.com" enabled="true">
<match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^(.*)foo.com(.*)$" />
<action type="Rewrite" value="{R:1}foo.localhost{R:2}" />
</rule>
In the pattern, ^(.*) will match anything (0 or more characters) from the beginning before foo.com and (.*)$ anything after foo.com until the end.
You can then use the back references in the action, where {R:1} will take the value matching (.*) before foo.com and {R:2} the value matching (.*) after foo.com

Related

IIS: Rewrite / Redirect [duplicate]

I do my best to scan the forum for help to make a web.config to do a Rewrite of this kind of url
domain.com/default.asp?id=3&language=2
My hope is that this can be
domain.com/en/service
where language=2 is "en"
and id=3 is page "Service" (this name exist in a mySQL)
I can only find example that do it vice versa...
Like this
<rewrite>
<rules>
<rule name="enquiry" stopProcessing="true">
<match url="^enquiry$" />
<action type="Rewrite" url="/page.asp" />
</rule>
</rules>
</rewrite>
I would like it to be something like this... I know this isn't correct, but maybe explains my problem.
<rewrite>
<rules>
<rule name="enquiry" stopProcessing="true">
<match url="^default.asp?id=3&language=2$" />
<action type="Rewrite" url="/en/serice" />
</rule>
</rules>
</rewrite>
If you want to use regular expressions you could do something like this
<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
<match url="^([^/]+)/([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="default.asp?language={R:1}&id={R:2}" />
</rule>
This would rewrite "domain.com/en/service" as "domain.com/default.asp?language=en&id=Service", or "domain.com/2/3" as "domain.com/default.asp?language=2&id=3"
To change the 2 to en and the 3 to service, along with all the other options though I think you would need a separate rule for each permutation, or have some sort of logic within your asp pages to read your querystring variables and send the corresponding values to your SQL queries. Note also that the parameters in the friendly url appear in the same order and the querystring variables in the rewritten URL, although this shouldn't really be an issue. If someone tries to access the page with the original "unfriendly" url they will find what they are looking for, whichever way round they enter the querystring variables.
Please note, I didn't actually hand code the rule above, I generated it with the URL Rewrite module in IIS manager - it makes life a lot easier
Also note, as discussed with my namesake in the other answer, this only applies to IIS7 and above
I have done this in Classic ASP using custom error pages and this seems to be the best way unless you use some sort of third party component installed on the server.
To do this, in IIS (or web.config) you need to set up 404 errors to go to a specific custom error Classic ASP page (eg. 404.asp).
In this custom error page you first need to check to see if the URL is valid. If it is you can Server.Transfer to the correct page, return a 200 response code, and parse the URL there to convert the URL to the values needed for the database lookup, etc. If it's not a valid URL then you show a custom error page and return a 404 response code.
The code to check for a valid URL and to retrieve the URL parameters will vary greatly depending on your URL structure. But to find the URL requested on the custom 404 error page you have to look at the querystring, which will be something like "404;http://domain.com:80/en/service/".
Here's some sample code that gets the parameters from the requested URL:
Dim strUrl, intPos, strPath, strRoutes
strUrl = Request.ServerVariables("QUERY_STRING")
If Left(strUrl, 4) = "404;" Then
intPos = InStr(strUrl, "://")
strPath = Mid(strUrl, InStr(intPos, strUrl, "/") + 1)
If strPath <> "" Then
If Right(strPath, 1) = "/" Then strPath = Left(strPath, Len(strPath) - 1)
End If
strRoutes = Split(strPath, "/")
'Here you can check what parameters were passed in the url
'eg. strRoutes(0) will be "en", and strRoutes(1) will be "service"
End If
And here's how you can setup custom error pages in the web.config (rather than in IIS):
<?xml version="1.0"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" subStatusCode="-1" responseMode="ExecuteURL" path="/404.asp" />
</httpErrors>
</system.webServer>
</configuration>

Can you use URL_Rewrite rewritemaps to modify ServerVariables in IIS?

So I'm having an issue and not sure if it's even possible.
Here's the scenario. We utilize an F5 loadbalancer with an i-Rule set to send us a header (HTTP_IV-USER) value based on an access token.
We want to query that header, see if it matches a value we have setup in a rewritemap and then change it accordingly.
I haven't seen anyone doing this with servervariables. It makes sense on how to do it in regards to changing an URL... but we'd like to change a header variable.
Basically we're taking the value from the Token, which is a number, and then matching that number to a username in active directory.
Thanks for the help!
Of course, we can use rewritemap to check and replace the value. You could modify the rule below to achieve your requirement.
<rewriteMaps>
<rewriteMap name="StaticMap">
<add key="aaaaaaaaa" value="bbbbbbbb" />
</rewriteMap>
</rewriteMaps>
<outboundRules>
<rule name="rewritemaprule">
<match serverVariable="HTTP_IV-USER" pattern="(.*)" />
<conditions>
<add input="{StaticMap:{HTTP_IV-USER}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" value="{C:1}" />
</rule>
</outboundRules>

IIS URL Rewrite - if query parameter(s) is missing

So this is "not your everyday requirement" for today :)
I want to create a rule that will redirect to some other page only if some query parameters are missing.
i found a few examples that will rewrite/redirect if the parameters exists,
but how do i go about if i want to check if they dont exists?
for example, this will test if the parameters exist and redirect based on that:
<rule name="RedirectUserFriendlyURL1" stopProcessing="true">
<match url="^$" />
<conditions>
<add input="{QUERY_STRING}" pattern="^lon=([^=&]+)&lat=([^=&]+)&zoom=([^=&]+)$" />
</conditions>
<action type="Redirect" url="/{C:1}/{C:2}/{C:3}" appendQueryString="false" />
</rule>
how can i change this rule to test if they do NOT exist?
^((?!regex).)*$ Is the regular expression for does not contain regex.
read more here http://bloggernitin.blogspot.in/2007/12/regex-for-doesnt-contain.html
If you are looking for something like lon=xyz doesn't exists in params then use this regex
^(?!lon=(xyz)) this will check if lon param is not there at the start of string
More examples -
In case you have a case where only zoom param is there is query string and lat/lon are missing
e.g. querystring a) "lat=23&zoom=10" b) "zoom=13"
regex - ^(?!lon=.)(?!lat=.)zoom=([^=&]+)
result - a) no match b) match $1= 13
now you can give default value to other params.

URL Rewriting (IIS) - how to represent an url pattern in match tag

I have a url rewrite rule for my IIS 7 server which is following:
<rewrite>
<rules>
<rule name="topcontent">
<match url=".*">
<action type="rewrite" url="mysite.com/{R:0}"/>
</match>
</rule>
</rules>
</rewrite>
Now I have to provide an exception to this rule, for a particular location, which is 'http://tempurl94.goto.com/?q=x&m=y' where 'http://tempurl94.goto.com' will always be there
in the url, and query parameter q and m may vary. So we have to write different rule for
this url. How to write a different (match url=?).
May be I can write a rule before the 'topcontent' rule and say stopProcessing='true'.
But I need to know what should I write inside <match url=' ? '> and what should I write in <action> tag.
You need to add conditions element to the new rule. Put the new rule before the current one and set stopProcessing to true as you mentioned.
<conditions>
<add input="{HTTP_HOST}" pattern="^tempurl94\.goto\.com$" />
</conditions>

iis 7.5 url rewrite -not processing percent '%' symbol

I imported rules from IIRF into IIS URL Rewrite, and most seemed to work fine. I just noticed tho that some urls have percent symbols in them (trying to redirect some bad inbound links, with percent encoded characters in them). The regex seems to not work when the percent is in there, so I assume it is trying to interpret is as a command or something. Can't find any documentation on this, anyone know?
The accepted answer didn't work in my case, but I discovered a different way to setup the rewrite rule. This will do a 301 redirect.
Requested URL: http://www.shuttercontractor.com/m/vinyl-%E2%80%8Bshutters.aspx
Target URL: http://www.shuttercontractor.com/m/vinyl-shutters.aspx
<rule name="301 Redirect to vinyl shutters category" stopProcessing="true">
<match url="." ignoreCase="false" />
<action type="Redirect" redirectType="Permanent" url="m/vinyl-shutters.aspx" />
<conditions>
<add input="{UNENCODED_URL}" pattern="m/vinyl-%[Ee]2%80%8[Bb]shutters\.aspx" ignoreCase="false" />
</conditions>
</rule>
Basically, the match will work on any URL, and we use a condition with the UNENCODED_URL server variable to ensure the pattern matches before redirecting.
appears that the rewrite rules already undo the url encoding, so it no longer sees a %3E as that, but instead as a '<'.. so using a > in place of %3E does the trick. Now, to go fix a bunch of urls. argh.
Edit:
Also, if you hand edit the web.config (versus using the UI editor), you will need to use & lt ; for the < symbols. It's probably best to use the UI to avoid confusion.

Resources