UrlRewriteModule无法在8.5上运行

时间:2016-07-21 13:59:41

标签: asp.net xml url-rewriting web-config umbraco

我们将umbraco v4网站从运行IIS6的旧服务器迁移到运行IIS8.5的新服务器。网站使用UrlRewriteModule隐藏网址中的网页名称,但除主页外的所有网页都返回404未找到。有人可以请帮助。谢谢!

这是注册url重写模块的代码 -

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

我尝试了以下内容(由另一个Stack Overflow线程建议),但我仍然有错误.-

将web.config文件中的HttpModules定义从system.web复制到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>

我尝试过在另一个网站上看到的这个vb类,但是在我的webconfig中注册后它还没有工作 -

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

1 个答案:

答案 0 :(得分:1)

我不会使用Umbraco附带的UrlRewrite模块,它可以用于较小的东西,但它不再表现那么好。我相信它在某些时候(可能是V8)被从核心中移除。

使用IIS URL重写模块会更好,它可以作为IIS管道的一部分运行,并且速度更快。它还支持更多功能。

您可以在此处找到有关该模块的信息:http://www.iis.net/downloads/microsoft/url-rewrite