Search code examples
asp.netxmlurl-rewritingweb-configumbraco

UrlRewriteModule not working on 8.5


We have moved our umbraco v4 websites from an old server running IIS6 to a new one running IIS8.5 The sites use UrlRewriteModule to hide the page name in the urls however all of the pages except the home page return a 404 not found. Can someone please help. Thank you!

This is the bit of code that is registering the url rewrite module -

    <system.webServer>
    <modules>
    <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
    </modules>
</system.webServer>

I have tried the following (suggested by another Stack Overflow thread) but Im still have the error.-

Copy the HttpModules definition in your web.config file from system.web to system.webServer

<system.web>
       <httpModules>
          <add name="UrlRewriteModule"type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
       </httpModules>
</system.web>

  <system.webServer>
    <modules>
        <add name="UrlRewriteModule"type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter" />
    </modules>
<system.webServer>

UrlRewriting.config -

<?xml version="1.0" encoding="utf-8"?>
<urlrewritingnet xmlns="http://www.urlrewriting.net/schemas/config/2006/07">
    <rewrites>
        <!-- 
                Urlrewriting.Net is a cool tool, what can make your urls look nice.
                The rewriting is controlled with regular expressions. To get more help
                look at http://www.urlrewriting.net/. 

                Remember to read the manual! 
                http://www.urlrewriting.net/download/UrlRewritingNet20.English.pdf

                The sample below rewrites a url from 
                "/product/someproductid.aspx" to 
                "/product.aspx?productid=someproductid" 

                The user will not see the rewritten path! The page that will be 
                loaded from umbraco will instead be:
                "/product.aspx?productid=someproductid" 

                <add name="produktidrewrite" 
                    virtualUrl="^~/product/(.*).aspx" 
                    rewriteUrlParameter="ExcludeFromClientQueryString" 
                    destinationUrl="~/product.aspx?productid=$1" 
                    ignoreCase="true" />

                This sample is usefull for a productpage, where the product comes from a 
                dynamic datasource, e.g. a database. The querystring "productid" can be loaded
                from the template, into a macro, that then loads the product!

                Any bugs or problems with the rewriter, contact Anders/Duckie
            -->

      <add name="test" 
                    virtualUrl="^~/technology/(.*).aspx" 
                    rewriteUrlParameter="ExcludeFromClientQueryString" 
                    destinationUrl="~/technology/default.aspx" 
                    ignoreCase="true" />


    </rewrites>
</urlrewritingnet>

I tried this vb class that I saw on another site but after registering it in my webconfig its still not working -

Imports System
Imports System.Web
Imports System.Data

Public Class URLRedirector
    Implements IHttpModule

    Private mdsRedirect As DataSet

    Public Sub Init(ByVal TheApp As HttpApplication) Implements IHttpModule.Init
        AddHandler TheApp.BeginRequest, AddressOf Me.Application_BeginRequest
        ' Cache the redirection file in a dataset.
        mdsRedirect = New DataSet()
        mdsRedirect.ReadXml(HttpContext.Current.Server.MapPath("~/App_Data/Redirection.xml"))
    End Sub

    Public Sub Dispose() Implements IHttpModule.Dispose
        mdsRedirect = Nothing
    End Sub

    Private Sub Application_BeginRequest(ByVal Source As Object, ByVal e As EventArgs)
        Dim oApp As HttpApplication = CType(Source, HttpApplication)
        Dim strRequestUri As String

        strRequestUri = oApp.Request.Url.AbsoluteUri.ToLower()

        ' OPTION 1: Process all requests (use when running in Visual Studio)...
        ' Redirect known paths and just let the others fall through.
        ' Call RedirectKnownPath(oApp, strRequestUri)

        ' OPTION 2: Process only the 404 requests (use when running under IIS)...
        ' For this module to work under IIS, you must configure the web site to redirect
        ' all 404 requests back to the application.
        If strRequestUri.Contains("?404;") Then
           If Not RedirectKnownPath(oApp, strRequestUri) Then
              ' Send all 404 requests for unknown paths to the default page.
              oApp.Response.Redirect("~/Default.aspx")
           End If
        End If
    End Sub

    Private Function RedirectKnownPath(ByVal oApp As HttpApplication, ByVal strRequestUri As String) As Boolean
        Dim strOriginalUri As String = strRequestUri
        Dim intPos As Integer
        Dim boolPathRedirected As Boolean = False
        Dim oRow As DataRow
        Dim strRequestPath As String
        Dim strDestinationUrl As String

        ' Extract the original URL if you received a 404 URL.
        intPos = strRequestUri.IndexOf("?404;")
        If intPos > 0 And strRequestUri.Length > (intPos + 5) Then
            strOriginalUri = strRequestUri.Substring(intPos + 5)
        End If

        ' Redirect the request if you find a matching request path.
        For Each oRow In mdsRedirect.Tables(0).Rows
            strRequestPath = Convert.ToString(oRow("RequestPath")).ToLower()
            If strOriginalUri.EndsWith(strRequestPath) Then
                strDestinationUrl = Convert.ToString(oRow("Target"))
                Call oApp.Response.Redirect(strDestinationUrl, False)
                boolPathRedirected = True
                Exit For
            End If
        Next

        Return boolPathRedirected
    End Function
End Class

Solution

  • I wouldn't use the UrlRewrite module that ships with Umbraco, it's OK for smaller stuff, but it doesn't perform that well any more. I believe it's being removed from the core at some point (possibly V8).

    You'd be much better off using the IIS URL Rewrite module, which runs as part of the IIS pipeline, and is MUCH faster. It also supports more features.

    You can find out about the module here: http://www.iis.net/downloads/microsoft/url-rewrite