IIS 7.0 rewrite module for file name - regex

I have a website with many links to *.index.html pages that do not exist any more, all default documents have now changed to index.htm, I'm trying to set a URL redirect/rewrite to the new pages but with no luck, here is an exmaple:
http://example.com/somedirectory/maybeanotherdirectory/index.html
I need to redirect that request to:
http://example.com/somedirectory/maybeanotherdirectory/index.htm
I have added different rules to the web.config but so far I can only redirect to:
http://example.com/index.htm
How do I sustain the exact path while only changing index.html to index.htm?

Such an old question, and I stumbled across it purely by happenstance. In case anybody comes across it in look for an answer, you can install the IIS URL ReWrite module, and add the following to your web.config:
<rewrite>
<rules>
<rule name="Html to htm">
<match url="(.*)\.html" />
<action type="Rewrite" url="{R:1}.htm" />
</rule>
</rules>
</rewrite>
Cheers!

Related

Rewrite Rule in IIS (web.config) - Negate All Subfolders

I need to rewrite a certain page on my website from an extension-based page (.asp) to a non-extension based page. However when I do this the rule also affect all sub-folders. The page is as follows:
www.mysite.com/my-page
It needs to re-write to:
www.mysite.com/my-page.asp
However I need to negate the following from re-writing:
www.mysite.com/my-page/sub-folder-1
www.mysite.com/my-page/sub-folder-1/sub-folder-2
etc.
The code I currently have is as follows:
<rule name="re-write-rule-test" stopProcessing="true">
<match url="^my-page" />
<action type="Rewrite" url="/my-page.asp" />
<conditions>
<add input="{REQUEST_URI}" pattern="^/([^/]+)?$" negate="true" />
</conditions>
</rule>
But it isn't working. The re-write on the actual page works fine but the the negation is failing and all sub-folder pages are also being re-written.
Can you please help?
Thanks,
Jason
Answered by Tensibai as per the below. Thanks!
I assume changing by would be enought (adding a termination to the match to avoid matching everything starting by 'my-page'. – Tensibai 58 mins ago

How to convert a apache url rewrite rule to IIS rule?

I have url rewrite rule on my .htaccess file like this.
RewriteEngine on
RewriteRule ^(scripts|css)/(.+)\.(.+)\.(js|css)$ $1/$2.$4 [L]
I need to use the same rule on my IIS .
I have used ^(.*)\.[\d]{10}\.(css|js) for the pattern.
I am not sure what to mention Rewrite URL.
I want to rewrite the url /css/structure.1234.css as /css/structure.css
Anyone knows please help?
I read your other ColdFusion question (regarding using regex to add a numerical value to a filename.)
We use an underscore and a 14 digit datestamp. Here's the IIS Rewrite Rule that we use. You can modify it for your needs.
<rule name="CSSJSDatestamp" stopProcessing="true">
<match url="^(.*)(_[0-9]{14}\.)(css|js)$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{SCRIPT_NAME}" pattern="/_scripts/" />
</conditions>
<action type="Rewrite" url="{R:1}.{R:3}" />
</rule>
BTW, I don't use this method anymore with my ColdFusion-drive websites since installing IISpeed (PageSpeed for IIS). It automatically minifies, concats and caches JS/CSS files when the files are changed (without the need for cach-busting). It can also optimize images based on device support (ie, reduce size, auto-conversion to WebP, etc). I also really like that it can move all CSS & JSS to the HEAD of the HTML file, prioritize CSS and lazy loads all images "below the fold" with having to add any ColdFusion code or use jQuery.
For more info on IISpeed/Pagespeed, check out:
http://www.iispeed.com/
http://www.iispeed.com/pagespeed/insights
https://developers.google.com/speed/pagespeed/

IIS RewriteUrl RegularExpression

I'm using IIS 7.5 and UrlRewrite Module 2. I've read the official documentation for the module here, as well as many examples on SO and tested my regex on Regexpal. Somehow the translation into the Web.config file is causing me problems. I've tried escaping the parantheses also.
The regex I'm using is:
^partners/(var|distributors|msp|techpartners)/(na|emea|apac)(|/)(.*)
a few example urls:
partners/var/emea
partners/msp/apac/
partners/var/na/abcdabcdabcd
Here is the web.config I have so far:
<rules>
<rule name="partnersListing" enabled="true" stopProcessing="true">
<match url="^partners/(var|distributors|msp|techpartners)/(na|emea|apac)(|/)(.*)" />
<action type="Rewrite" url="partnersList.aspx?type=${R:1}&region={R:2}" />
</rule>
</rules>
Not sure if I want the action to be Rewrite or Redirect yet, but the pattern isn't working either way. Any help is greatly appreciated
Per your answer to my question in the comments:
Is this rule in the site root web.config or a subdirectory web.config?
#Kev in a subdirectory: "/partners"
From the docs:
http://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference?amp;clcid=0x409
Quote:
Note that the input URL string passed to a distributed rule is always
relative to the location of the Web.config file where the rule is
defined. For example, if a request is made for
http://www.mysite.com/content/default.aspx?tabid=2&subtabid=3, and a
rewrite rule is defined in the /content directory, then the rule gets
this URL string default.aspx as an input.
Based on this you need to change your url match to:
^(var|distributors|msp|techpartners)/(na|emea|apac)(|/)(.*)
Assuming your re-write rule exists in:
http://example.com/partners/web.config
There is just one other thing which is what appears to be an extraneous $ character in your redirect/rewrite url in front of back reference {R:1}, I'm not sure if you intended that to be there or not.

Need IIS 7 Url Rewrite Version 1.1 Regex Help To Remove Folder From Url

I am using:
IIS 7
Url Rewrite Module Version 1.1
Asp.Net MVC 4
I am hosting my sites in a shared hosting environment.
No site is hosted in the root folder as all sites are in their own physical folder and I use the domain name of the site as the physical folder name.
I would like to change my urls from this
http://www.mysite1.com/mysite1
http://mysite1.com/mysite1
to this
http://www.mysite1.com/
http://mysite1.com/
I have this and it doesn't work.
**DOES NOT WORK**
<rule name="RemoveFolder" stopProcessing="true">
<match url="mysite1/(.*)" />
<action type="Rewrite" url="/{R:0}" appendQueryString="true" />
</rule>
Can someone give me a regular expression that would add www to any urls and remove the folder that is showing up in the url?
OK. What I typed below, doesn't work for me. I thought it did, but I realized it didn't.
#Cheesemacfly, I'm trying to remove the subfolder from the url,
Redirect the user back to the site with the url MINUS the subfolder,
Make sure that there is NOT a continuous loop.
Cheesemacfly, your answer didn't work, but it did put me on the path to the full correct answer.
Thank you chesse for putting me on the right path.
This rule removes the subfolder from the url and redirects the user back to the page without the subfolder. The condition makes sure that I don't have a continual redirect. Once the url has been rewritten, that conditional will stop the url from matching again.
I placed this rule in the ROOT web.config of my hosting account.
The root ONLY contains a web.config and all of the subfolders.
<rule name="Cleanup" stopProcessing="true">
<match url="theFolderINeedToRemove/(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTP_HOST}" pattern="^mywebsite.com/theFolderINeedToRemove$" />
</conditions>
<action type="Redirect" url="/{R:1}" appendQueryString="true" />
</rule>

Is this the best place to use a 301 redirect to control which domain name is used?

I am using ColdFusion 9.0.1
I have a new site that is accessible through a few domains such as:
mydomain.com
www.mydomain.com
foo.mydomain.com
For SEO and tracking purposes, I want to make sure that only "mydomain.com" is indexed and accessed. So, every request that tries to access my site through other domains will be 301 directed to "mydomain.com".
I want to make sure that I capture and preserve the query string so that I don't just send people to the home page.
I will also make sure that I can access the site locally at 127.0.0.1
I wondering where in the code is the best place to do this SPECIFIC type of redirect. My guess it's in application.cfc near the top, in the onRequestStart() method.
Is this best place to put the code and does is this code complete? Is there a better way to code this?
<cfscript>
ThisHost = CGI.HTTP_HOST;
QString = CGI.QUERY_STRING;
GoToURL = "http://mydomain.com?" & QString;
if (ThisHost != "mydomain.com" && ThisHost != "127.0.0.1") {
writeOutput("<cfheader statuscode='301' statustext='Moved permanently'>");
writeOutput("<cfheader name='location' value='#GoToURL#'>");
abort;
}
</cfscript>
UPDATE
I know this isn't the best way to accomplish what I need, because this task is much better suited to the web server's skill set. Here's my code till I can implement this on the web server:
<cfscript
ThisHost = CGI.HTTP_HOST;
QString = CGI.QUERY_STRING;
GoToURL = "http://flyingpiston.com/?" & QString;
if (ThisHost != "flyingpiston.com" && ThisHost != "127.0.0.1:8500") {
location(GoToURL, false, 301);
}
<cfscript
I agree with other comments and answers that doing this at the web server is a better solution. I would also point out that if you want to use the script syntax, this is entirely wrong and will simply return a string to the browser:
writeOutput("<cfheader name='location' value='#GoToURL#'>");
In ColdFusion 9, you would instead use the location() function:
location("url", addtoken, statusCode);
In your case:
location(GoToURL, false, 301);
Your GoToURL variable is also missing the page name, so you'd need to add CGI.SCRIPT_NAME into the mix just before the ? to get the full URL being called.
With the tag syntax (as of ColdFusion 8 I believe), there is no need to use the CFHEADER tag for a 301 redirect. The CFLOCATION tag now supports a statuscode attribute which can be set to 301 as needed.
If you are on IIS 7.0 the you may be able configure your web.config file for a canonical redirect like so:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^domain.com$" />
</conditions>
<action type="Redirect" url="http://www.domain.com/{R:0}"
redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Check out this link for additional options.
The previous answer shows how to redirect domain.com to www.domain.com. If you want to redirect www.domain.com to 'domain.com', you will need a web.config file that looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<location path="" overrideMode="Inherit">
<system.webServer>
<rewrite>
<rules>
<rule name="remove www" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_HOST}" pattern="www.*" />
<add input="{HTTP_HOST}" pattern="foo.*" />
</conditions>
<serverVariables />
<action type="Redirect" url="http://{C:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</location>
</configuration>
The above web.config file was created on IIS 7.5 (Windows Server 2008 R2).
Your host will need to install the URL Rewrite Module as mentioned above in order for this to work.
The web.config file is stored in the root folder of your site.
The above example will redirect 'www' and 'foo' sub-domains to the domain.
This 10 URL Rewriting Tips and Tricks article has been a good reference for me.