如何通过ASP.NET重定向和修改无扩展名的URL?
我们已将结构重新设计为具有多个业务部门的网站。现在,我想重定向(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,则它会正确重定向。
解决方案
我们是否已确保每个网站的web.config文件都相同(假设:1234与:80不同)
另外,我们是否尝试过localhost:80?
我们当前是否在Visual Studio Web服务器中测试该站点?通常,该站点在" localhost:nnnnn"上运行,其中" nnnnn"是端口号(如上所示是1234),它不会将其设置为不运行。
如果我们在相关计算机上安装了IIS,则将项目发布到该计算机上,并且我们应该能够验证该项目在没有" nnnnn"的情况下是否可以正常工作,因为代码中似乎没有任何内容会导致该错误这样做。
也许我们想看一下路由。
看:
- http://msdn.microsoft.com/en-us/library/cc668201.aspx
- http://blogs.msdn.com/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx
好吧,如果端口指示我们正在使用内置的Web服务器(VS附带的服务器),则此方法可能有效,因为它始终通过ASP.NET框架路由请求。
以/ abc结尾的请求将不会自动路由通过ASP.NET框架,因为IIS可能不"知道"我们想要它们。我们需要检查IIS设置,以确保将此类请求路由到aspnet_isapi.dll。
编辑:为此,我们需要添加一个通配符映射:
- 在IIS管理器中,展开本地计算机,展开"网站"文件夹,右键单击所需的网站或者虚拟目录,然后单击"属性"。
- 单击适当的选项卡:主目录,虚拟目录或者目录。
- 在"应用程序设置"区域中,单击"配置",然后单击"映射"选项卡。
- 在"可执行文件"文本框中键入DLL的路径,或者单击"浏览"导航到它(例如,ASP.NET 2.0 dll位于我的c:\ windows \ microsoft.net \ framework \ v2.0.50727 \ aspnet_isapi.dll上机器)
- 对于扩展名,当然要使用不带引号的"。*"
- 选择要查找的动词(GET,HEAD,POST,DEBUG是ASP.NET的惯用选项,由我们决定)
- 确保选择了"脚本引擎"或者"应用程序引擎"
- 取消选中"检查文件是否存在"
- 单击确定。
我可能对此不满意,但是如果我愿意,希望有人会纠正我。 :)
http:// localhost / example / abc没有像我们期望的那样调用Global.asax。通常,http:// localhost在端口80(:80)上运行。如果要在端口80上运行站点,则需要在IIS中部署站点才能在此处运行。
我们需要在IIS中设置处理程序映射,以将所有未知扩展转发到asp.net。第一个有效是因为cassini正在处理所有请求,第二个无效是因为IIS正在寻找该目录,并且该目录不存在,而不是.net框架运行我们拥有的代码。
这是有关如何在asp.net中进行网址重写的信息。
如果可能的话,我建议使用新的"应用程序请求路由"或者UrlRewrite.net
我们应该使用IIS通配符重定向,我们将需要以下内容;
*; www.example.com/*; www.example.com/default.aspx?article=##代码##
微软有合理的参考
如果我们使用的是Apache,我认为我们需要修改htaccess文件。
默认情况下,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。