url rewrite / to default.aspx - asp.net

We are experiencing some issues with our application where the default document (default.aspx) is not being picked up due the the appPool is set to Classic. It appears to be an issue documented here:
Site not redirecting to Default Document in Classic pipeline mode
to get around this we are trying to use the IIS URL Rewrite feature.
We want any request which comes to www.example.com/ to go to www.example.com/default.aspx
I used IIS to set it up on the root folder for the application, but i don't see it working, this is what it generated:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Default Documen Rewrite">
<match url="/" />
<conditions>
<add input="{QUERY_STRING}" pattern="/" />
</conditions>
<action type="Rewrite" url="/default.aspx" />
</rule>
</rules>
</rewrite>
</system.webServer>
EDIT:
I just tried the following and it seems to be working, does anyone know if it's correct?
<rewrite>
<rules>
<rule name="Root Hit Redirect" stopProcessing="true">
<match url="^$" />
<action type="Redirect" url="mysite/default.aspx" />
</rule>
</rules>
</rewrite>

Related

Web Deploy deleting IIS website custom configuration

I'm using Web Deploy (from VS2013) to publish an ASP.NET MVC site to an IIS 7.5.
I added some URL rewrite rules and custom HTTP response headers through IIS manager.
The problem is everytime I deploy a new version of the site, this extra configuration is deleted.
Is this the expected behaviour or is there something wrong? How can I keep these custom settings on each deploy?
UPDATE
So I understood I need to put these changes in the web.config. I'm trying to put them in the Web.Release.config but it's not being added to the deployed web.config. I guess I'm missing some XDT:Transform rule.
This is what I got in my Web.Release.config (yes, the publishing profile is using this Release config).
<configuration>
<!-- some other stuff -->
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to www" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTP_HOST}" pattern="mydomain.com" />
</conditions>
<action type="Redirect" url="http://www.mydomain.com/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Turn the build action of your web.config to None. That will prevent the file from being deployed each time you publish.
Edit
For inserting entire sections into a web.config from the web.release.config, you need the xdt:Transform="Insert" added like so:
<system.webServer xdt:Transform="Insert">
<rewrite>
<rules>
<rule name="Redirect to www" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTP_HOST}" pattern="mydomain.com" />
</conditions>
<action type="Redirect" url="http://www.mydomain.com/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
Ok so I understood I need to add this custom configuration in the web.config using XDT:Transform.
I added this to the Web.Release.config and it worked:
<system.webServer>
<rewrite xdt:Transform="Insert">
<rules>
<rule name="Redirect to www" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTP_HOST}" pattern="mydomain.com" />
</conditions>
<action type="Redirect" url="http://www.mydomain.com/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>

How to route ALL requests for domain to a sub folder asp.net

I have seen lots of solutions to this but none seem to work....
I have a domain
producerpte.co.uk
But I have a separate application set up in a sub folder so to see the root of that application you have to go to...
producerpte.co.uk/producerpte
However I want it so that the user does not see the 'site1' part of the url.
When I use url rewriting in Web.Server config or I use Context.RewritePath in code (in an application set up on the root) it simply redirects the user to the url (with site1 in it) I do not want the user to know they are going to a subfolder.
Am I setting this up wrong?
I'm actually using Winhost. All the examples ive tried just do not change result of the call without redirecting the url :-(
I have been told by winhost that I should do it with code/configuration. I would prefer to do it with code to be honest....
UPDATE : I tried Max's answer and I did...
<rules>
<rule name="Redirect if producerpte" stopProcessing="true">
<match url="^ producerpte/(.*)$" />
<action type="Redirect" url="{R:1}" />
</rule>
<rule name="Rewrite to sub folder">
<match url="^.*$" />
<action type="Rewrite" url="producerpte/{R:0}" />
</rule>
</rules>
But no luck :-( And the urls still change in the browser....
If WinHost did enable IIS Rewrite Module, edit your web.config file and give this rule a try:
<rewrite>
<rules>
<rule name="Redirect if site1" stopProcessing="true">
<match url="^site1/(.*)$" />
<action type="Redirect" url="{R:1}" />
</rule>
<rule name="Rewrite to sub folder">
<match url="^.*$" />
<action type="Rewrite" url="site1/{R:0}" />
</rule>
</rules>
</rewrite>
--- UPDATE ---
Well, I tested this IIS configuration:
I've added rules on the root site.
IIS created a web.config file:
Here's the content of the web.config file:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect if producerpte" stopProcessing="true">
<match url="^producerpte/(.*)$" />
<action type="Redirect" url="{R:1}" />
</rule>
<rule name="Rewrite to sub folder">
<match url="^.*$" />
<action type="Rewrite" url="producerpte/{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
http://localhost:8066/ displays the content of C:\inetpub\wwwroot\producerpte\producerpte without changing the URL in browser
http://localhost:8066/producerpte/ displays the content of C:\inetpub\wwwroot\producerpte\producerpte but the URL in browser is changed to http://localhost:8066/
Be sure that you created rules on the root site (and not the sub application) and I noticed that you had a leading space in your config: <match url="^ producerpte/(.*)$" /> between ^ and producerpte.

asp.net activate URL Rewrite IIS7

How to activate URL Rewrite in my project. I installed URL Rewrite, I see it in my IIS
When I add a simple rule in my web.config file
e.g. a rule just to remove default.aspx from the url or make url lower case
<configuration>
<system.web>
<compilation debug="false" targetFramework="4.0" />
</system.web>
<system.webServer>
<rewrite>
<rules>
<rule name="LowerCaseRule1" stopProcessing="true">
<match url="[A-Z]" ignoreCase="false" />
<action type="Redirect" url="{ToLower:{URL}}" />
</rule>
<rule name="Default Document" stopProcessing="true">
<match url="(.*)Default.aspx" />
<action type="Redirect" url="{R:1}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
and when I run the project the rules don't work, please advice, thank you
I haven't tried above code, but did that long before.
I always followed this
http://www.iis.net/learn/extensions/url-rewrite-module/using-custom-rewrite-providers-with-url-rewrite-module
See if it helps you.

Redirect to www in IIS7 - classic pipeline mode

I want to implement redirects on an IIS7 webserver. Basically, if the subdomain is not included in the URL, I will redirect to the www subdomain.
http://mysite.com/file.aspx redirects to http://www.mysite.com/file.aspx
http://mysite.com/image.jpg redirects to http://www.mysite.com/image.jpg
http://mysite.com/text.html redirects to http://www.mysite.com/text.html
How to do this?
I do not want to write any HTTP Module -- it must be done thru IIS config only.
Also, I am required to use Classic Pipeline mode and cannot install any ISAPI plugins.
Is it possible?
You can throw this into your web.config file:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^http://mysite.com$" />
</conditions>
<action type="Redirect" url="http://www.mysite.com/{R:0}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
In IIS7 it can be done through the url rewrite section.
This solution worked for me:
1) Install URL Rewrite component:
http://www.iis.net/download/urlrewrite
2) Add to web.config:
<system.webServer>
<rewrite>
<rules>
<rule name="CanonicalHostNameRule1" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^mysite\.com$" />
</conditions>
<action type="Redirect" url="http://www.mysite.com/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>

IIS URL Rewrite and Web.config

I don't understand anything about IIS, but am trying to solve this problem of redirecting all visitors to example.com/page to example.com/page.html
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRedirects">
<add key="/page" value="/page.html" />
</rewriteMap>
</rewriteMaps>
</rewrite>
</system.webServer>
</configuration>
A couple of problems arise:
I don't know where to even put the file. There is a User root directory, and an htdocs directory, I tried both, no joy.
I don't even know if the account can do rewrites, I am trying to find that out.
1) Your existing web.config: you have declared rewrite map .. but have not created any rules that will use it. RewriteMap on its' own does absolutely nothing.
2) Below is how you can do it (it does not utilise rewrite maps -- rules only, which is fine for small amount of rewrites/redirects):
This rule will do SINGLE EXACT rewrite (internal redirect) /page to /page.html. URL in browser will remain unchanged.
<system.webServer>
<rewrite>
<rules>
<rule name="SpecificRewrite" stopProcessing="true">
<match url="^page$" />
<action type="Rewrite" url="/page.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
This rule #2 will do the same as above, but will do 301 redirect (Permanent Redirect) where URL will change in browser.
<system.webServer>
<rewrite>
<rules>
<rule name="SpecificRedirect" stopProcessing="true">
<match url="^page$" />
<action type="Redirect" url="/page.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
Rule #3 will attempt to execute such rewrite for ANY URL if there are such file with .html extension (i.e. for /page it will check if /page.html exists, and if it does then rewrite occurs):
<system.webServer>
<rewrite>
<rules>
<rule name="DynamicRewrite" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_FILENAME}\.html" matchType="IsFile" />
</conditions>
<action type="Rewrite" url="/{R:1}.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
Just wanted to point out one thing missing in LazyOne's answer (I would have just commented under the answer but don't have enough rep)
In rule #2 for permanent redirect there is thing missing:
redirectType="Permanent"
So rule #2 should look like this:
<system.webServer>
<rewrite>
<rules>
<rule name="SpecificRedirect" stopProcessing="true">
<match url="^page$" />
<action type="Redirect" url="/page.html" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
Edit
For more information on how to use the URL Rewrite Module see this excellent documentation: URL Rewrite Module Configuration Reference
In response to #kneidels question from the comments; To match the url: topic.php?id=39 something like the following could be used:
<system.webServer>
<rewrite>
<rules>
<rule name="SpecificRedirect" stopProcessing="true">
<match url="^topic.php$" />
<conditions logicalGrouping="MatchAll">
<add input="{QUERY_STRING}" pattern="(?:id)=(\d{2})" />
</conditions>
<action type="Redirect" url="/newpage/{C:1}" appendQueryString="false" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
This will match topic.php?id=ab where a is any number between 0-9 and b is also any number between 0-9.
It will then redirect to /newpage/xy where xy comes from the original url.
I have not tested this but it should work.
Just tried this rule, and it worked with GoDaddy hosting since they've already have the Microsoft URL Rewriting module installed for every IIS 7 account.
<rewrite>
<rules>
<rule name="enquiry" stopProcessing="true">
<match url="^enquiry$" />
<action type="Rewrite" url="/Enquiry.aspx" />
</rule>
</rules>
</rewrite>

Resources