【发布时间】: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