IIS dynamic redirect rules - iis

I am writing a number of redirect rules in IIS and need some guidance to make them as dynamic as possible.
I want to have a rule that goes from /foldername/* to /newfolder/foldername/*
And the file name to be appended to the end in each case. The part I'm struggling with it getting the foldername to be added to the result.
Here is the code I have so far:
<rule name="Rule name" stopProcessing="true">
<match url="^foldername" />
<action type="Redirect" url="/newfolder/{R:1}" redirectType="Permanent" />
</rule>
In the above example I want to be able to carry over the original folder location and file name. {R:1} only carries the file name.

I am surprised {R:1} was carrying the file name because when I tested it wasn't the case.
Anyway, to do what you want, you have to change the pattern from ^foldername to ^foldername/(.*). This way, {R:0} will contain the whole path (when using ^foldername, {R:0} contains only the part starting with and matching foldername).
You rule will go as:
<rule name="Rule name" stopProcessing="true">
<match url="^foldername/(.*)" />
<action type="Redirect" url="/newfolder/{R:0}" redirectType="Permanent" />
</rule>

Related

IIS Redirect to Subfolder only if specified

Thank you for your time. Please note that all folder specifics will go to their own separate domains each and anything else will go to one specific domain.
I am trying to redirect my website with some redirect rules and I can help but think something is missing.
Essentially, I need
website.com/newlink to forward to extwebsite.com
website.com/otherlink to forward to othextwebsite.com
(And a few others that I will specify)
If not specified I need all others that don't match the folder specific request to *.website.com/* forward to
https://www.Ournewwebsite.com
I am trying to write these IIS rules and have been banging my head on a wall for 4 days. I've done a lot of research and haven't been able to come up with the correct answer. Please advise.
You can create 3 rules to match different situations, you can use the following rules as a reference:
<rule name="r1" stopProcessing="true">
<match url="^newlink$" />
<action type="Redirect" url="www.extwebsite.com" />
</rule>
<rule name="r2" stopProcessing="true">
<match url="^otherlink$" />
<action type="Redirect" url="www.othextwebsite.com" />
</rule>
<rule name="r3" stopProcessing="true">
<match url="^(?!newlink|otherlink).*$" />
<action type="Redirect" url="https://www.Ournewwebsite.com" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(.*).website$" />
</conditions>
</rule>

URL Alias in IIS 8.5 Using URL Rewrite Module

I need to create easy to remember URL's that redirect to long and hard to remember paths for a large number of applications.
i.e.
subdomain.domain.edu/shortname
redirects to
https://www.subdomain.domain.edu/mainApplication/subfolder/page
I'm using the URL Rewrite module in IIS 8.5, but I keep getting a 404 when I browse to the short alias. I know the rewrite module is working as I use it to handle rewriting HTTP to HTTPS and to add WWW to a URL.
My rewrite rule looks like:
<rewrite>
<rules>
<rule name="Easy to remember shortcut" stopProcessing="true">
<match url=".*subdomain.domain.edu/shortname" />
<conditions>
<add input="{URL}" pattern=".*/shortname" />
</conditions>
<action type="Redirect" url="https://www.subdomain.domain.edu/mainApplication/subfolder/page.aspx" />
</rule>
</rules>
</rewrite>
Of course this returns a 404. Any ideas?
Forgive me if there is already an answer to this in another post, however, I've read through and tried over 30 posts on the URL rewrite module and have not yet found the solution for actually creating an alias.
Url rewrite match condition won't be able to see your domain i.e. if the URL is https://www.subdomain.domain.edu/shortname the match part can only see shortname (anything after domainname/).
To validate the host we need to add in the conditions clause. So your rule will be something like below
<rule name="shortnameURL" enabled="true" stopProcessing="true">
<match url="shortname" />
<action type="Redirect" url="mainApplication/subfolder/page" />
<conditions>
<add input="{HTTP_HOST}" pattern=".*subdomain.domain.edu" />
</conditions>
</rule>
Also it should be ok if you add the entire URL here
<action type="Redirect" url="mainApplication/subfolder/page" /> as below
<action type="Redirect" url="https://www.subdomain.domain.edu/mainApplication/subfolder/page" />

IIS Rewrite Rule - how to manipulate {HTTP_HOST} string

I've just started using iis rewrite rules for the first time and I'm struggling with what I imagine is an easy rule.
Basically, I wish to use this rule
<rule name="redirect">
<match url="^(one$|two$|three$)" />
<action type="Redirect" url="{HTTP_HOST}{REQUEST_URI}" />
</rule>
But have the redirect {HTTP_HOST} string minus the extension [.co.uk / .com etc.].
e.g.
bigsite.co.uk/one
would redirect to:
bigsite.co.uk/bigsite/one
How does one go about this - for I can only find Tolower / UrlEncode / UrlDecode string manipulators?
[Ultimately, I would also like to then use a rewrite rule to hide the fact that the redirect has occurred, i.e. the address would remain as bigsite.co.uk/one after the redirect.]
Well I eventually came up with this (hope it may help someone):
<rule name="redirect">
<match url="^(one$|two$|three$)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^(www.)?(.*).co.uk" />
</conditions>
<action type="Redirect" url="{C:2}{REQUEST_URI}" />
</rule>
...not sure if there is a better way, but it works perfectly for me - thanks all, PP

url rewrite - remove subdomain only when directory meets criteria

I have seen a handful of similar questions on handling removing the www from a URL, but I was needing to remove it only when a certain directory exists. The real issue is that I run the "test" in URL Rewrite within IIS and it works fine, but for some reason does not respond when I type in the URL. I have tried switching to when "not matches" and it redirects, so I am a bit baffled what I am doing wrong to get this to work.
An example URL would be http://www3.test.com/feed/testing.xml
If the directory "feed" exists in the URL then remove the www3. I thought this would be fairly simple.
<rule name="fix feeds" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="(www3\.)(.*)(feed/.*)" />
</conditions>
<action type="Redirect" url="http://{C:2}{C:3}" appendQueryString="false" redirectType="Permanent" />
Another issue I am finding is that if you set it to permanently redirect 301, then once you get something to fire (and may not work as expected) the browser caches the 301 redirect and makes a mess of your testing environment.
You can't match feed in HTTP_HOST instead you need to use Match URL.
You have to match /feed/testing.xml in match URL which will yield here R:0
Match your patter if it has www3 and take C:2 which will give you URL without www3.
<rule name="fix feeds" enabled="true" stopProcessing="true">
<match url="^feed/.*" />
<conditions>
<add input="{HTTP_HOST}" pattern="(www3\.)(.*)" />
</conditions>
<action type="Redirect" url="http://{C:2}/{R:0}" appendQueryString="false" redirectType="Permanent" />
</rule>

Rewrite rules in ISS's web.config

I'm just trying to get some code running on ISS that has been running on Apache for a long time.
A particular mod_rewrite rule is proving difficult to get working.
In Apache I've used:
RewriteRule ^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$ /media/$1/$2.$4
[L]
To turn a URL like /media/css/style.1367406756.css into /media/css/style.css, letting me put timestamps in the files to avoid caching issues.
In my web.config file I've added:
<rule name="Cache bust assets" stopProcessing="true">
<match url="^(.*)$"/>
<conditions>
<add input="{URL}" pattern="^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$"/>
</conditions>
<action type="Rewrite" url="/media/{R:1}/{R:2}.{R:4}" appendQueryString="true" />
</rule>
Which, looks like it should work. (It's alongside another rule, which works fine, so it's not that the server isn't parsing it or anything).
I don't get any errors, other than visiting /media/css/style.1367406756.css gives me a 404 error.
How Can I make this work?
You use {R:N} back references in your action when you should use {C:N} since the information comes from the conditions. See Using Back-references in Rewrite Rules for more information.
You can see this error if you open the iismanager console:
To get your rule to work you have 2 solutions.
First you can change your action to (using {C:N}):
<action type="Rewrite" url="/media/{C:1}/{C:2}.{C:4}" appendQueryString="true" />
Or (and I do think it is a better solution), you can use the Import mod_rewrite Rules tool.
In the iismanager console, click on Import Rules... (on the right tab) and paste your apache rule:
This will create for you the following rule:
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^media/(js|css|img|font)/(.+)\.(\d+)\.(js|css|png|jpg|gif)$" ignoreCase="false" />
<action type="Rewrite" url="/media/{R:1}/{R:2}.{R:4}" />
</rule>

Resources