4

我们已将结构重新设计为具有多个业务部门的网站。现在我想将(301)重定向到新页面。

IE:
是 www.example.com/abc
现在是 www.example.com/default.aspx?article=abc

我曾尝试使用 Global.asax 来执行此操作,并且当我通过它进行调试时它可以正常工作。

        if (Request.RawUrl.Contains("abc"))
        {
            Response.RedirectLocation = "/default.aspx?article=abc";
            Response.StatusCode = 301;
            Response.StatusDescription = "Moved";
            Response.End();
        }

所以http://localhost:1234/example/abc正确重定向,但是(其中 1234 是调试服务器的端口)
http://localhost/example/abc没有重定向,它给了我一个 404。

有任何想法吗?


附加信息:如果我去http://localhost/example/abc/default.aspx那么它会正确重定向。

4

8 回答 8

6

好吧,如果端口表明您正在使用内置的 Web 服务器(VS 附带的服务器),这可能会起作用,因为它总是通过 ASP.NET 框架路由请求。

以 /abc 结尾的请求不会自动通过 ASP.NET 框架,因为 IIS 可能不“知道”您想要它们。您需要检查 IIS 设置以确保将此类请求路由到 aspnet_isapi.dll


编辑:为此,您需要添加通配符映射

  1. 在 IIS 管理器中,展开本地计算机,展开网站文件夹,右键单击所需的网站或虚拟目录,然后单击属性。
  2. 单击相应的选项卡:主目录、虚拟目录或目录。
  3. 在应用程序设置区域中,单击配置,然后单击映射选项卡。
  4. 要安装通配符应用程序映射,请执行以下操作:
    • 在映射选项卡上,单击添加或插入。
    • 在 Executable 文本框中键入 DLL 的路径或单击 Browse 导航到它(例如,ASP.NET 2.0 dll 位于我的 c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll机器)
    • 对于扩展名,当然可以使用不带引号的“.*”
    • 选择要查找的动词(GET、HEAD、POST、DEBUG 是 ASP.NET 常用的,由您决定)
    • 确保选择“脚本引擎”或“应用程序引擎”
    • 取消选中“检查文件是否存在”
    • 点击确定。

我可能对此不以为然,但如果我是,希望有人能纠正我。:)

于 2008-09-23T15:46:15.560 回答
2

你应该使用 IIS 通配符重定向,你需要这样的东西;

 *; www.example.com/*; www.example.com/default.aspx?article=$0

微软有一个合理的参考

如果您使用的是 Apache,我认为您需要修改 htaccess 文件。

于 2008-09-23T15:51:18.030 回答
1

您当前是否在 Visual Studio Web 服务器中测试该站点?这通常在“localhost:nnnnn”上运行站点,其中“nnnnn”是一个端口号(如上为 1234),它不会将其设置为在没有端口号的情况下运行。

如果您在相关机器上安装了 IIS,请将您的项目发布到它,您应该能够验证它是否可以在没有“nnnnn”的情况下工作,因为您的代码中看起来没有任何东西会导致它无法运行这样做。

于 2008-09-23T15:43:47.470 回答
0

您是否确保每个网站的 web.config 文件都相同(假设:1234 与 :80 不同)

另外,你试过 localhost:80 吗?

于 2008-09-23T15:42:42.713 回答
0

您的http://localhost/example/abc没有像您期望的那样调用 Global.asax。通常http://localhost在端口 80 (:80) 上运行。如果您想在端口 80 上运行您的站点,您需要在 IIS 中部署您的站点才能在此处运行。

于 2008-09-23T15:46:42.253 回答
0

您需要在 IIS 中设置一个 Handler 映射,以将所有未知扩展转发到 asp.net。第一个有效,因为 cassini 正在处理所有请求,第二个无效,因为 IIS 正在寻找该目录,并且它不存在,而不是运行您拥有的代码的 .net 框架。

这是有关如何在 asp.net 中进行 URL 重写的信息。

如果可能的话,我建议使用新的Application Request RoutingUrlRewrite.net

于 2008-09-23T15:49:20.280 回答
0

默认情况下,IIS 不会将所有请求都交给 ASP.NET 进行处理。只有一些资源扩展,其中“aspx”会被传递给asp.net进行处理。当您请求http://localhost/example/abc时发生的情况是 IIS 尝试定位目录以查看您是否有要从该目录加载的默认文件(即 default.aspx、index.html)。由于它找不到包含垃圾“abc”标签的目录,因此它永远找不到要加载的 default.aspx 文件。

当您尝试加载http://localhost/example/abc/default.aspx时,IIS 会看到“aspx”扩展名并立即将其交给 ASP.NET 运行时进行处理。http://localhost/example/abc请求没有加载的原因是它永远不会被交给 ASP.NET,所以当然 global.asax 永远不会看到它。

Cassini 托管站点处理所有请求,因此该调用确实由 ASP.NET 和 global.asax 文件处理。

我同意 Darren Kopp 的观点,他建议您需要在 IIS 中设置处理程序映射以将未知扩展转发到 ASP.NET。

于 2008-09-23T19:16:58.830 回答