Rewrite IIS Url's Except App Root - regex

I hate Regex's and it hates me, here is the problem:
I am dealing with the infamous Angular routing and legacy browsers (IE9+), I have solved all issues but one, which is that in IE the root url for the app requires a forward slash (and only the root). At the same time I need to remove all forward slashes from other non root requests as demonstrated here in this borrowed snippet:
<rule name="Remove trailing slash" stopProcessing="true">
<match url="(.*)/$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{R:1}" />
</rule>
This works perfectly, I just do not know how to get a request for exactly this: http://localhost/jumpstart
Rewritten as: http://localhost/jumpstart/ with the trailing slash, while preserving the other rule for non app roots requests.
I thought a match of *\/jumpstart(?!\/) would suffice, but it fails to work.
Any help would be appreciated.
Thanks!

You should be able to use something such as:
<rule name="Add trailing slash to jumpstart" stopProcessing="true">
<match url="(.*[^/])$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" pattern="(.*?)jumpstart$" negate="true" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{R:1}/" />
</rule>

Related

iis rewrite redirect all pages to homepage

I'm attempting to redirect all pages on a IIS site to the homepage/root. My rule below seems to work however I get a "localhost redirected you too many times" error.
The rule needs to exclude anything before the slash e.g mysite.com/mypage/
<rule name="redirect_all_bar_home_root" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{REQUEST_URI}" pattern="^$" negate="true"/>
</conditions>
<action type="Redirect" url="http://localhost" />
</rule>
This rule will do that:
<rule name="redirect_all_bar_home_root" stopProcessing="true">
<match url="^$" negate="true"/>
<action type="Redirect" url="/" />
</rule>
Regex: ^$ is matching when string is empty (it is homepage)
negate="true" is negating regexp. All URLs which are not homepage
I've just had a requirement to do this. The following rule will do what you need but with the exception that it will not attempt to redirect file urls so images still work on your homepage:
<rule name="RedirectAllToRoot" stopProcessing="true">
<match url="^$" negate="true" />
<action type="Redirect" url="/" redirectType="Temporary" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
</rule>
redirectType="Temporary" gives a 307 redirect status code

IIS redirect with regex [duplicate]

Whenever someone makes request over HTTP protocol I rewrite the url to make it HTTPS. This is the code in web.config:
<rule name="Imported Rule 1-1" enabled="true" stopProcessing="true">
<match url="^(?!https://).*" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{SERVER_PORT}" pattern="80" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="https://abc.com/{R:1}" />
</rule>
However when I browse on http:// I get IIS error
HTTP Error 500.50 - URL Rewrite Module Error. The expression "https://abc.com/{R:1}" cannot be expanded.
How can I resolve this? I am utterly confused.
The matches are zero based.
<action type="Rewrite" url="https://abc.com/{R:1}" />
Won't work because you only have one match. You need:
<action type="Rewrite" url="https://abc.com/{R:0}" />
Also, this won't work, because you can only match on the path below the site root.
<match url="^(?!https://).*" ignoreCase="false" />
It looks like you are checking for ssl. Try this instead:
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTPS}" pattern="^OFF$" />
</conditions>
You can redirect through web config to
Hope it will help full
<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^abc.com$" />
</conditions>
<action type="Redirect" url="http://www.abc.com/{R:0}" redirectType="Permanent" />
</rule>

Reduce Chained URL Redirects [IIS/Regex/ReWrite]

I have implemented some URL Redirects combined on IIS/ColdFusion is working fine but I am not able to deal with some regex pattern to reduce unneeded redirects.
Currently IIS is only handling a single redirect (at most) only if it finds a template name within the URL. e.g. IIS redirects a URL such as
http://example.com/index.cfm/something/pretty/?page=1
to
http://example.com/something/pretty/?page=1
For instance, it just removes the template name from the URL leaving everything intact following it. The final URL above is a valid one according to my application.
But in addition, if a trailing slash (/) is not found in the final URL, ColduFusion application is handling this case and appends a forward slash at the end, then redirects to a URL that ends with a forward slash (/) before a query string (if there is). It works with some logic to maintain PATH_INFO and QUERY_STRING intact. But that is actually causing multiple redirects in the following situation.
[INIT] http://example.com/index.cfm/sport/badminton
[Redirect 1] [IIS-301] http://example.com/sport/badminton
[Redirect 2] [CF-301] http://example.com/sport/badminton/
Now that I want to handle all of this in IIS and cover all cases in one Rule, I am not able to make (or find) a regex pattern that could do it.
Current IIS redirect pattern
^index.cfm/(.*)$
I have tried various ones along with the most simple
^index.cfm/(.*[^/])$
But it doesn't cover a URL with a QUERY_STRING. You can take me as real naive in making regular expressions.
Update 1: I found that the proper term for the issue is "Chained" redirects and found an article at moz.com which is kind of handling the same issue I've referred above. I guess it should work, and while I am on it changing the rules as required on my server, I thought I should update this question with something I have found for others who may have such an issue. I'll update this as soon as I could use this solution to fix the issue at my side.
Sorry that I couldn't have an answer over here but as I updated above question about an article at moz.com, I have implemented that approach and successfully recovered from the Chained/Multiple redirects.
Previously our web application was supporting the following URL
https://www.example.com/index.cfm/something/pretty/
Than we used URL ReWriting in IIS and removed index.cfm from the URL. But we had trouble that there were multiple/chained redirections to redirect from non-https, non-www, or no trailing slash, etc.
https://moz.com/blog/what-every-seo-should-know-about-iis#chaining
After reading the article above, I've implemented following set of rules on IIS that now takes care of all the cases we had previously handled on IIS and on ColdFusion separately.
<rules>
<!-- rewrite url to furnish with prefix(_) to better match individual parts -->
<rule name="Remove index.cfm" stopProcessing="false">
<match url="(.*?)/?index\.cfm/(.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
</conditions>
<action type="Rewrite" url="_{R:2}" />
</rule>
<rule name="Add Trailing Slash" stopProcessing="false">
<match url="(.*[^/])$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="_{R:1}/" />
</rule>
<rule name="ToLower Everything in URL" enabled="true" stopProcessing="false">
<match url="(.*)" ignoreCase="false" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{R:1}" pattern="[A-Z]" ignoreCase="false" />
</conditions>
<action type="Rewrite" url="_{ToLower:{R:1}}" />
</rule>
<!-- Now redirect the final prefix-furnished URL -->
<!-- match if there is at least one (_) at the start of the furnished URL. Redirect to the final URL -->
<rule name="http[non www] to https[www] redirect" stopProcessing="true">
<match url="^(_*)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.yoursite\.com$" negate="true" />
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{SERVER_PORT}" pattern="80" />
</conditions>
<action type="Redirect" url="https://www.example.org/{R:2}" />
</rule>
<rule name="http[www] to https[www] redirect" stopProcessing="true">
<match url="^(_*)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{SERVER_PORT}" pattern="80" />
</conditions>
<action type="Redirect" url="https://www.example.org/{R:2}" />
</rule>
<rule name="https[non www] to https[www] redirect" stopProcessing="true">
<match url="^(_*)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_HOST}" pattern="^www\.yoursite\.com$" negate="true" />
<add input="{HTTP_METHOD}" pattern="GET" />
<add input="{SERVER_PORT}" pattern="443" />
</conditions>
<action type="Redirect" url="https://www.example.org/{R:2}" />
</rule>
<!-- this rule is supposed to run final redirect if non above redirect rules occured -->
<rule name="http// redirect" enabled="true" stopProcessing="true">
<match url="^(_+)(.*)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{HTTP_METHOD}" pattern="GET" />
</conditions>
<action type="Redirect" url="{R:2}" />
</rule>
<!-- now after failing/running all rules above when the IIS reaches at this point, it's the fully validated/funrished URL that qualifies to serve with response. Rewrite the URL to run index.cfm as a template -->
<rule name="URL ReWrite" enabled="true" stopProcessing="true">
<match url="^(.*)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" pattern="/admin" negate="true" />
</conditions>
<action type="Rewrite" url="index.cfm/{R:1}" />
</rule>
These rules are strictly according to our requirement where we wanted all requests to be routed to [https], you must check the moz.com article above for reference.
Hope this could help others.

RegExp web.config - Select path after / and rewrite as URL param

I have a requirement to update the web.config file so that it replaces the path after the / and rewrites the URL as follows:
domain.com/acct01 -> domain.com/#/?id=acct01
domain.com/acct02 -> domain.com/#/?id=acct02
domain.com/acct03 -> domain.com/#/?id=acct03
...
Currently, for every account I am adding the following to the web.confg file. So for the above example I would need to do the following:
<rule name="acct01" stopProcessing="true">
<match url="^acct01$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://domain.com/#/?id=acct01" />
</rule>
<rule name="acct02" stopProcessing="true">
<match url="^acct02$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://domain.com/#/?id=acct02" />
</rule>
<rule name="acct03" stopProcessing="true">
<match url="^acct03$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://domain.com/#/?id=acct03" />
</rule>
As you can see, this can become unwieldy after many accounts. I'm looking for a general way of capturing the value of after the last / inside of the URL and a more generalized way of replacing the URL in the action section after the id URL param. For example:
<rule name="addIDFromPath" stopProcessing="true">
<match url="[REGEX FOR GENERAL EXTRACTION OF PATH AFTER LAST /]" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://domain.com/#/?id=[VALUE OF PATH EXTRACTED]" />
</rule>
If the URL contains a #, it should be ignored and left alone since this is an indication that it has been rewritten.
We are on a Windows Box with IIS installed so an alternative to the web.config file may be considered.
Thank you!
Not sure if I understood question correctly, but if the idea is to replace last / with /#/?id= then this pattern will do the work, replace
(?=\/([a-z0-9]+)$)
with /#/?id=.
You can test it here: https://regex101.com/r/kW8zU0/1
EDIT
Probably something like this:
<rule name="addIDFromPath" stopProcessing="true">
<match url="(^|\/)([a-z0-9]+)(?=$)" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Redirect" url="https://domain.com/#/?id={R:2}" />
</rule>
Not sure about group number, could be {R:1}
Pattern: (^|\/)([a-z0-9]+)(?=$)
Demo: https://regex101.com/r/kW8zU0/4

IIS 7 Redirect using regular expression

We currently have a wordpress blog running under a sub domain http:// blog.domain.com. That site is also currently running via reverse proxy as http:// www.domain.com/blog that points to the original subdomain site.
Currently both sites are running correctly but the issue we have is that we want the sub domain site to redirect to the reversed proxy site and not render. We only want the site to render as http:// www.domain.com/blog. I have been attempting to use the URL Rewrite in IIS 7 on a server 2008 machine.
I think the issue I am having is with the regular expression. I tried using -- ^(blog.)* -- and when I test it in IIS it returns that it matches (blog.domainname.com) but the site itself does not redirect when I open it in a browser. I'm not sure what I am missing. Thanks in advance for your help.
<rewrite>
<rules>
<rule name="Main Rule" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" /></rule>
<rule name="wordpress" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" /> </rule>
<rule name="redirect to /blog" enabled="false" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^(blog.)*" />
<action type="Redirect" url="http:// www.domainname.com/blog" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="(.*)" />
</conditions>
</rule>
</rules>
</rewrite>
The problem is probably that your rewrite rules are not running when you hit that URL.
Make sure that it's actually mapped to that site.
Sorry, I just noticed that your rule is not enabled:
<rule name="redirect to /blog" enabled="false" patternSyntax="ECMAScript" stopProcessing="true">
You'd have to modify the enabled attribute to True.