我很想知道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。正如其中一个答案所指出的那样,从行动中重定向是否有效?
答案 0 :(得分:2)
它不是关于IIS URL重写。它是关于ASP.NET路由的 在问题ID被简单忽略后,它看起来绝对像字符串。因为它没有这个字符串参数,所以可能是为了方便用户使用它。
在ASP.NET MVC中,您有路由。如果您对此不太了解 - 请阅读以下两篇文章:at MSDN,at 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使其以这种方式工作的功能。您可以在浏览器开发人员工具的“网络”选项卡中查看它。