【问题标题】:Old Classic ASP pages getting caught in MVC Route旧的经典 ASP 页面陷入 MVC 路由
【发布时间】:2012-01-22 20:11:34
【问题描述】:

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

Response.RedirectPermanent(objRedirect.new_url, True)

这就是我们所需要的。

我已在数据库表中输入了所有旧 URL,并带有新 URL 的对应列。我在自定义 404 页面中添加了代码以获取原始 URL:

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

所以我可以在数据库中查找它。 (有趣的旁注,这里的 MSDN 文档 - Redirect Mode - 似乎说如果我在 web.config 的 CustomErrors 部分设置 RedirectMode=ResponseRewrite,我就不必担心执行上述操作,但是当我尝试过时那,我收到 IIS 错误,说它不会提供 ASP 页面?!?!?)

我遇到的问题是,与新 MVC 路由具有相同目录的任何旧的经典 ASP URL 都以某种方式被部分路由。例如,“/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()))

并且它们似乎都没有任何区别(显然我一次尝试了它们)。

这也不仅仅局限于一个路由 - 它发生在旧站点上存在的与新站点上的命名路由匹配的任何目录。

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

更新:这是我发现的另外 2 个“问题”:

  1. 我丢失了原始查询字符串。所以,如果 product.asp?id=1 被请求,我在错误页面中只有 product.asp (知道如何获取/保存原始查询字符串吗?)
  2. 我的另一条路线如下所示:

    routes.MapRoute("IndependentSales", _ “独立销售/{action}”,_ 新的 {.controller = "independentsales", .action = "index"})

当我请求“/resale/default.asp”时,它转到“resale/independentsales”。这是怎么回事???

【问题讨论】:

  • 您是完全迁移系统还是仍然依赖旧的asp页面?

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


【解决方案1】:

您尝试过使用 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 文件。考虑到条件部分,你可以用它做很多事情。在这种情况下,我只在它不是文件而不是目录时才进行重写。

【讨论】:

  • 我认为您将 Microsoft 的 URLRewriter 工具称为explained by Scott Guthrie?我确实看到了,但由于我们的网站是由 ISP 托管的,所以我不确定我是否能够安装它,所以我试图不必去那里。
  • 我无法确认,但任何支持 ASP.Net 的主机都支持 web.config 文件。您可以在您的机器中创建它(手动或使用 IIS)并将其上传到应用程序根目录。它是 IIS 7 及更高版本的标准功能。
  • 我确实将重写代码添加到了我的 web.config,但它没有做任何事情。我很确定您必须在 IIS 中安装 URLRewrite 代码才能使其工作。
  • 你是对的。但我认为这是 IIS 7+ 的标准功能
【解决方案2】:

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

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

所以,这对我来说可能是独一无二的,但也许我可以为其他人节省数小时的挫败感......如果你认为你一切都正确,也许你做到了!创建一个新项目并尝试一下!

...当程序员真糟糕! ;-D

(沉思......我没有添加回我的新项目的三件事是:

  1. 记录工具ELMAH
  2. RouteMagic DLL
  3. 和 RouteDebugger.dll。

我可能会尝试从我的原始项目中减去它们,看看效果如何。鉴于 ELMAH 的受欢迎程度以及路线的编写者,我无法想象它们会有问题,但谁知道......?)

【讨论】:

  • 还有一个“啊哈时刻”(或者可能是“duh!时刻”!?!?!)当您测试永久重定向并第一次出错时,您的浏览器会“记住”并且该 URL 的每个未来测试都不会通过您的代码,而是您的浏览器只是重定向它(...我没有想到为什么我没有遇到代码断点!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多