我们已将结构重新设计为具有多个业务部门的网站。现在我想将(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,那么它会正确重定向。
答案 0 :(得分:6)
好吧,如果端口指示您正在使用内置Web服务器(VS附带的那个),这可能有效,因为总是通过ASP.NET框架路由请求。 / p>
以/ abc结尾的请求不会自动路由到ASP.NET框架,因为IIS可能不会“知道”您希望它们。您需要检查IIS设置以确保此类请求被路由到aspnet_isapi.dll
编辑:要完成此操作,您需要添加wildcard mapping:
我可能会对此不以为然,但如果我是,希望有人会纠正我。 :)
答案 1 :(得分:2)
你应该使用IIS通配符重定向,你需要这样的东西;
*; www.example.com/*; www.example.com/default.aspx?article=$0
有合理的参考
如果您正在使用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 Routing或UrlRewrite.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。