旧的经典ASP页面被MVC路由捕获

时间:2011-12-17 23:39:32

标签: vb.net model-view-controller asp-classic routing redirect

我正在将现有的经典ASP网站转换为(VB)MVC,我不希望任何现有的URL中断。我已经阅读了很多关于如何进行正确的301重定向的帖子(比如这个:Routing Classic ASP Requests To .NET - SEO Redirects)。随着最新的MVC发布,我收集了

Response.RedirectPermanent(objRedirect.new_url, True)

就是所需要的一切。

我已在数据库表中输入了所有旧网址,其中包含新网址的相应列。我在自定义404页面中添加了代码以获取原始网址:

Dim strURL As String = Request.RawUrl.Substring(Request.RawUrl.IndexOf("aspxerrorpath=") + 15).ToLower()

所以我可以在数据库中查找。 (有趣的旁注,MSDN的文档 - Redirect Mode - 似乎说如果我在web.config的CustomErrors部分设置RedirectMode = ResponseRewrite,我就不用担心上面做的了,但是当我'我试过这个,我得到IIS错误,说它不会提供ASP页面?!?!?)

我遇到的问题是,我的旧的经典ASP URL与新的MVC路由具有相同的目录,不知何故被部分路由。例如,“/ test/default.asp”在我错误页面的上述strURL变量中显示为“/ test / test”。

我确实有“测试”的路线设置:

routes.MapRoute("Test", _
                "test/{action}", _
                New With {.controller = "test", .action = "index"})
在Global.aspx.vb中

,但我也尝试了所有可以想到的方法来忽略路由中的所有ASP页面(似乎无济于事)。以下是我的尝试(我确实看到一个旧的 - 2008年 - Phil Haack的帖子说我只能拥有其中一个“全部捕获”忽略路线,但不知道这是否仍然有效或不):

routes.IgnoreRoute("{file}.asp")
routes.Ignore("{resource}.asp/{*pathInfo}")
routes.IgnoreRoute("{resource}.asp/{*pathInfo}")
routes.Add(New Route("{resource}.asp/{*pathInfo}", New StopRoutingHandler()))

并且它们中没有一个似乎有任何区别(我明显地尝试了所有这一个)。

这不仅仅与一条路线隔离 - 它出现在旧网站上存在的与新网站上的命名路线匹配的任何目录上。

提前感谢您提出的所有建议!

更新:以下是我发现的另外两个“问题”:

  1. 我正在失去最初的查询字符串。所以,如果请求product.asp?id = 1,我在错误页面中的所有内容都是product.asp(任何想法如何获取/保存原始查询字符串?)
  2. 我的另一条路线如下:

    routes.MapRoute(“IndependentSales”,_                 “independentntsales / {action}”,_                 新的{.controller =“independentntsales”,。。action =“index”})

  3. 当我请求“/resale/default.asp”时,它会转到“转售/独立销售”。那是什么???

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用web.config?

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Remove index.php" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
                    <match url="^(.*)$" />
                    <conditions logicalGrouping="MatchAll">
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

上面的示例用于重写CodeIgniter应用程序,以省略URL中的index.php文件。考虑到条件部分,你可以用它做很多事情。在这种情况下,如果它不是文件而不是目录,我只会进行重写。

答案 1 :(得分:0)

好的,经过几个小时的阅读/研究/调试后,我得出的结论是我没有做错任何事,并且在Visual Studio,.NET,MVC中有一些“错误”......一些东西!我是对的!我从头开始创建了一个新项目,在那里复制了我的所有代码,一切正常!

(好吧,我不确定“它应该”是正确的,但我确实让我的代码按照我想要的方式运行。对ASP页面的请求仍然打击了MvcApplication_BeginRequest - 我不认为它们应该与我的IgnoreRoute条目???? - 但至少扩展程序仍然在那里,所以我可以在我的数据库中查找ASP页面并进行重定向!)

所以,这对我来说可能是独一无二的,但也许我可以节省其他时间的挫折......如果你认为你有一切正确,也许你这样做!创建一个新项目并试试!

  

......成为一名程序员真是太糟糕了! ;-D

(Musings ......我没有加入到我的新项目中的3件事是:

  1. 日志工具ELMAH
  2. RouteMagic DLL
  3. 和RouteDebugger.dll。
  4. 我可以尝试从原始项目中减去它们,看看它是怎么回事。鉴于ELMAH的流行以及编写路线的人,我无法想象他们会有问题,但谁知道......?)