重写URL的有效方法

时间:2015-07-01 05:27:47

标签: asp.net-mvc url-rewriting iis-7.5

我很想知道Stackoverflow如何重写URL 例如

http://stackoverflow.com/questions/7325278/group-by-in-linq
http://stackoverflow.com/questions/7325278/
http://stackoverflow.com/questions/7325278
http://stackoverflow.com/questions/7325278/random-blah

所有这些都重定向到 http://stackoverflow.com/questions/7325278/group-by-in-linq

我必须做一些非常相似的事情,但是我应该点击数据库来获取针对密钥的重定向URL(在这种情况下是问题ID),还是应该在我的应用程序中维护字典,还是有更好的方法来实现它?
很高兴知道SO是如何做到的。

更新:
用户策划的URL都是301d到规范URL。正如其中一个答案所指出的那样,从行动中重定向是否有效?

1 个答案:

答案 0 :(得分:2)

它不是关于IIS URL重写。它是关于ASP.NET路由的 在问题ID被简单忽略后,它看起来绝对像字符串。因为它没有这个字符串参数,所以可能是为了方便用户使用它。

在ASP.NET MVC中,您有路由。如果您对此不太了解 - 请阅读以下两篇文章:at MSDNat ASP.NET

默认情况下,您有以下RouteConfig

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Welcome", action = "Index", id = UrlParameter.Optional }
);

这意味着如果您有类似的行为:

public class InformationController : Controller
{    
    public ActionResult Get(int id)
    {
        // ...
    }
}

然后您可以通过以下方式访问它:

http://yourwebsite.com/Information/Get/7325278

相同
http://yourwebsite.com/Information/Get/?id=7325278

如果您想要一个额外的参数,您可以改变您的路线以使用2,3或更多参数。

然后,你会做一个

http://yourwebsite.com/Information/Get/7325278/group-by-in-linq

等同于

http://yourwebsite.com/Information/Get/?id=7325278&someParam=group-by-in-linq

这是StackOverflow topic about routes with multiple arguments

假设您现在有多个参数路由。 现在,您可以描述您的操作中的任何逻辑。例如,您可以在代码中使用此参数,或者可以忽略第二个参数并重定向到必要的URL(StackOverflow如何)。
也许,我的伪伪代码会帮助你:

public ActionResult Get(int id, string unnecessaryString)
{
    var question = questionsDbProvider.getById(id);
    if (question.ShortUrlText == unnecessaryString)
        return RedirectToAction("Get", new { 
            id = id, 
            unnecessaryString = question.ShortUrlText 
        });
}

此类行为代码将检查其第二个参数是否正确,否则重定向更正 301重定向正是StackOverflow使其以这种方式工作的功能。您可以在浏览器开发人员工具的“网络”选项卡中查看它。