我们正在与一个.NET 3.5的解决方案替换旧的传统的ASP网站。
我们需要重定向所有的经典ASP请求到aspx页面(即contactus.asp,现在可以路线/contact-us/default.aspx)。 我woudl喜欢是请求打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引擎。 大,但随后如果我们需要托管在我们的网站IIS将发送请求到错误的地方传统的ASP网站。
我发现了一个很好的解决方案在这里
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,并把这些标签,我有没有快乐(500服务器错误实际上)web.config中的正确部分。
任何人都可以揭示出这个任何灯光或给我一个完美的解决方案。
有一种感觉,将上述溶液难道不为PHP或ASP作为工作IIS将有路由请求它获取到.NET发动机之前。
提前致谢
史蒂夫
大编辑:我指出通过@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
最简单的就是在IIS级别使用自定义404错误页面。 此页面可以是任何ASPX页面; 您可以访问通过HttpContext的原始请求。
在IIS 6.0中,你会发现,在默认情况下的URL映射到.NET发动机(的.aspx ,, ASMX等)使用web.config中定义自己的404处理器。 不管; 你甚至会引起这些网页发送给IIS 404页,如果编辑ASPX引擎映射,并确保为tickbox“文件必须存在”设置。 这会将所有博肯链接到IIS 404处理器,即使它们被映射到.NET处理程序。 人们作出的努力全部重定向断开链接到web.config中定义404handler的错误; 它定义了一个instread必须更容易,如果你只是强制所有去IIS。
爱德华多的Molteni的回答工作,除了一两件事。 它实际上是通过浏览器中的302,而不是301。
我相信不是:
Context.Response.StatusCode = 301
Context.Response.Redirect("/something/")
它应该是:
Context.Response.StatusCode = 301
Context.Response.RedirectLocation = "/something")
该Response.Redirect的基本上是中断你用的Response.StatusCode设置和浏览器最终得到一个“302找到”。
我真的不知道搜索引擎如何处理302 VS 301所以也许它不是一个问题。 在我看来,虽然,一个真正的永久重定向(301)将是首选。
对于那些在框架上的V4,似乎有一个新的选择:
Response.RedirectPermanent("/something")
我没有测试过这一点,但我假设它提供了一个301状态码。 详情点击此处: HttpResponse.RedirectPermanent
我用的是智能404处理器脚本的修改版本从http://evolvedcode.net/content/code_smart404/ 。 我添加的代码基于在我们的数据库中的表做自定义映射。
这个脚本很容易被重新编写ASP.NET中,然后被映射相同的方式。