【问题标题】:UrlRewriteModule not working on 8.5UrlRewriteModule 在 8.5 上不起作用
【发布时间】:2016-11-25 04:05:01
【问题描述】:

我们已将 umbraco v4 网站从运行 IIS6 的旧服务器移至运行 IIS8.5 的新服务器。网站使用 UrlRewriteModule 隐藏 url 中的页面名称,但是除主页外的所有页面都返回 404 not found .有人可以帮忙吗。谢谢!

这是注册 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

【问题讨论】:

  • 能否包含来自 config.xml 的重写规则。此外,如果您启用失败的请求跟踪,您将能够收集有关错误的更多信息。
  • 嗨菲尔。 TheUrlRewriting 配置几乎没有显示任何内容,所以我添加了一个名为 test 的条目,仍然得到相同的错误。
  • 我还启用了失败的请求跟踪。

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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2018-07-30
    • 2017-12-27
    • 2017-02-01
    • 2013-04-08
    • 1970-01-01
    • 2017-03-20
    相关资源
    最近更新 更多