如何通过ASP.NET重定向和修改无扩展名的URL?

时间:2008-09-23 15:38:55

标签: c# .net iis configuration routing

我们已将结构重新设计为具有多个业务部门的网站。现在我想将(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,那么它会正确重定向。

8 个答案:

答案 0 :(得分:6)

好吧,如果端口指示您正在使用内置Web服务器(VS附带的那个),这可能有效,因为总是通过ASP.NET框架路由请求。 / p>

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


编辑:要完成此操作,您需要添加wildcard mapping

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

答案 1 :(得分:2)

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

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

Microsoft

有合理的参考

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

答案 2 :(得分:1)

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

如果您在相关机器上安装了IIS,请将项目发布到它,并且您应该能够验证它是否在没有“nnnnn”的情况下工作,因为代码中的任何内容都不会导致它没有这样做。

答案 3 :(得分:0)

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

另外,你试过localhost:80?

答案 4 :(得分:0)

答案 5 :(得分:0)

您的http://localhost/example/abc未按预期调用Global.asax。通常http://localhost在端口80(:80)上运行。如果要在端口80上运行站点,则需要在IIS中部署站点以在此处运行。

答案 6 :(得分:0)

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

以下是有关如何执行Url Rewriting in asp.net的信息。

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

答案 7 :(得分: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中设置Handler映射,以便将未知扩展转发给ASP.NET。