我们正在用.NET 3.5解决方案取代旧的经典asp网站。
我们需要将所有经典ASP请求重定向到aspx页面(即contactus.asp,现在可以路由到/contact-us/default.aspx)。我喜欢的是请求命中global.asax所以我可以做类似
的事情If url == "bob.asp"
Response.Status = "301 Moved Permanently";
Response.AddHeader("Location", SiteConfig.SiteURL + redirectUrl);
End If
有两个不优雅的解决方案。
A)放置一个global.asa文件并通过它进行路由。
B)将asp文件映射到.NET引擎。很好,但是如果我们需要在我们的网站上托管经典的asp网站,IIS会将请求发送到错误的地方。
我在这里找到了一个很好的解决方案
http://forums.asp.net/p/1202225/3458901.aspx
哪个说明这样的话可能有用......
<buildProviders>
<add extension=".php" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
<httpHandlers>
<add verb="*" path="*.php" type="System.Web.UI.PageHandlerFactory" validate="True" />
</httpHandlers>
这个例子是针对php的,但我认为同样的事情适用于asp。但是,在示例中将.php更改为.asp并将标记放在web.config的正确部分后,我没有任何喜悦(实际上是500服务器错误)。
任何人都可以对此有所了解或给我一个优雅的解决方案。
有一种感觉上面的解决方案不能用于php或asp,因为IIS会在它到达.NET引擎之前路由请求。
提前致谢
史蒂夫
答案 0 :(得分:4)
大编辑: @EdSF在评论中指出答案是错误的。难以置信,我使用Firebug进行了检查,事实上,这是错误的。
您需要使用Context.Response.RedirectLocation
才能使状态代码生效。
我在global.asax中做了同样的事情:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
Dim fullOriginalpath As String = Request.Url.ToString.ToLower
If (fullOriginalpath.Contains("/verarticulo.asp?articuloid=")) Then
Context.Response.StatusCode = 301
''// this does not work, returns a 302
''//Context.Response.Redirect("/noticias/" + getIDFromPath(fullOriginalpath))
''// this does right way
Context.Response.RedirectLocation = "/noticias/" + getIDFromPath(fullOriginalpath)
Context.Response.End()
ElseIf (fullOriginalpath.Contains("/archivo.asp")) Then
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/archivo/"
Context.Response.End()
ElseIf (fullOriginalpath.EndsWith("/default.asp")) Then
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/"
Context.Response.End()
End If
End Sub
如果您使用的是II6,则必须执行此操作,您必须配置此ISAPI筛选器 这样:
该文件为c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll
答案 1 :(得分:1)
最简单的方法是在IIS级别使用自定义404错误页面。此页面可以是任何ASPX页面;您可以通过HttpContext访问原始请求。
在IIS 6.0中,您会注意到默认情况下,映射到.NET引擎的URL(.aspx,asmx等)使用web.config中定义的自己的404处理程序。不管;如果编辑ASPX引擎映射并确保设置“文件必须存在”的复选框,则甚至可以将这些页面发送到IIS 404页面。这会将所有boken链接重定向到IIS 404处理程序,即使它们映射到.NET处理程序也是如此。人们犯了错误,试图将所有损坏的链接重定向到web.config定义404handler;如果你强迫所有人去IIS定义的一个instread,那就更容易了。
答案 2 :(得分:1)
我相信而不是:
Context.Response.StatusCode = 301
Context.Response.Redirect("/something/")
它应该是:
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/something")
response.redirect基本上会中断你使用Response.StatusCode设置的内容,浏览器最终得到“302 Found”。
我不确定搜索引擎如何处理302 vs 301,所以可能不是问题。在我看来,真正的永久重定向(301)将是首选。
对于框架v4的那些人,似乎有一个新的选择:
Response.RedirectPermanent("/something")
我没有对此进行过测试,但我假设它提供了301作为状态代码。详情请见HttpResponse.RedirectPermanent
答案 3 :(得分:0)
我使用http://evolvedcode.net/content/code_smart404/的Smart 404处理程序脚本的修改版本。我添加了代码来根据数据库中的表进行自定义映射。
这个脚本可以很容易地在ASP.NET中重写,然后以相同的方式映射。