【问题标题】:Efficient way to rewrite URL重写 URL 的有效方法
【发布时间】:2015-09-18 03:06:00
【问题描述】:

我很想知道 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。正如其中一个答案所指出的那样,从动作中重定向是否有效?

【问题讨论】:

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


    【解决方案1】:

    这与 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 使其以这种方式工作的方式。您可以在浏览器开发者工具的 Network 标签中查看。

    【讨论】:

    • 是的,我知道这一点,但正如我的问题所指出的,我不想每次使用相同的键但使用不同的 helpText 时都点击 db(假设键是问题编号,而 helpText 是上下文用户文本),尤其是当我缓存了页面时。我将更新要考虑的有关缓存的问题。
    • @NullHead 301 重定向正是 StackOverflow 为使其以这种方式工作所做的工作。您可以在浏览器开发者工具的网络选项卡中查看它。您可以使用 ASP.NET 缓存来避免不必要的请求。
    • 我在更新中提到了这一点。我的问题是,从 Action 执行 301 效率如何?
    猜你喜欢
    • 2013-05-31
    • 2014-02-02
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    相关资源
    最近更新 更多