【问题标题】:How do get clean URLs like Stack Overflow?如何获得像 Stack Overflow 这样的干净 URL?
【发布时间】:2010-11-05 08:03:08
【问题描述】:

在某些 .NET 驱动的网站上,URL 不以 asp.net 页面名称结尾,例如 default.aspx,而是使用 http://sitename.comhttp://sitename.com/subdirectory/subdirectory 模式。该站点被映射为根目录下的子目录,即。 /tags、/users、/badges,URL 分别为 /tags、/users、/badges。

Stack Overflow 举一个具体的例子,使用 How do get clean URLs like Stackoverflow? 形式的问题 URL。这是为搜索引擎优化页面的好方法。

这是使用 HTTP 处理程序实现的吗? GET 请求是否根据路径过滤,整个响应是根据问题 ID 在处理程序本身中形成的?还有人愿意推测吗?

【问题讨论】:

  • 这个问题已经被问过很多次了。
  • 删除 SO 引用,这是一个很好的问题。
  • 哇;一个合法的问题被否决了 3 次,被错误地标记为与有关 ROR 的问题“重复”,即使它是“不是一个真正的问题”——而且我对 url_rewriting 的引用被否决了。这是一场彻头彻尾的惨败! :)
  • 基本上这家伙想知道路由是如何工作的,并且使用 stackoverflow 作为参考框架。让他休息一下。
  • 我觉得书呆子们应该去别处学究气了。使用 SO 作为问题的参考并没有错。

标签: .net architecture url-routing httphandler


【解决方案1】:

它是 ASP.Net MVC,或多或少内置了 .Net Routing。不过,Routing 也可用于非 MVC 项目

http://msdn.microsoft.com/en-us/library/cc668201.aspx

它只是一个 .dll,您可以将其放入您的 bin 文件夹中。基本上,它使用正则表达式将您的 URL 与页面/模板匹配。

【讨论】:

【解决方案2】:

这是通过 Apache 中的mod_rewriteurl_rewriting on IIS 的类似方法实现的。

注意:SOFlow 使用后者。

【讨论】:

  • 可能是因为有据可查的是该站点不使用 Apache。
  • 我说它使用 Apache 吗?不。提问者对 URL 的工作方式感兴趣。他没有具体说明他对从 .NET 的角度来看它们是如何工作的感兴趣。我为 Apache 和 IIS 提供了答案。
  • @Jonathan Sampson 标题确实表明/暗示他在询问 SO 是如何做到的,但问题本身并没有明确说明。无论如何,您的答案仍然正确 +1。
  • @Bryan,我同意他使用 SO 作为示例,但我们不应该假设他必须因此只期待 SO 使用的技术(因为他显然不知道它们是什么开始)。我是一名 PHP 开发人员,但我可能会问“SO 是如何完成 x...”,以便我可以在自己的技术领域内模拟它。我只是想确保我在回答问题时不会假设太多:) 感谢 ++;
【解决方案3】:

网址采用REST principles 之后的格式,其中所有内容都是具有唯一网址的资源。

我想我在博客的某处读到,这是通过使用 ASP.NET MVC framework 实现的。

【讨论】:

    【解决方案4】:

    我知道 Stack Overflow 使用的是 ASP.NET MVC 框架,该框架可能内置了 URL 重写系统。对于非 Windows 系统,Apache mod_rewrite 很常见。

    例如,一个 wiki 页面:http://server.com/wiki/Main_Page 请求由网络服务器处理。翻译成/wiki/index.php?page=Main_Page

    这是一个在 Apache 中重写 URL 的示例:

    RewriteEngine on
    RewriteRule ^forum-([0-9]+)\.html$ forumdisplay.php?fid=$1 [L,QSA]
    RewriteRule ^forum-([0-9]+)-page-([0-9]+)\.html$ forumdisplay.php?fid=$1&page=$2 [L,QSA]
    
    RewriteRule ^thread-([0-9]+)\.html$ showthread.php?tid=$1 [L,QSA]
    RewriteRule ^thread-([0-9]+)-page-([0-9]+)\.html$ showthread.php?tid=$1&page=$2 [L,QSA]
    

    这表示如果传入的 URL 是 forum-##.html,则处理该请求,就好像它是 forumdisplay.php?fid=##thread-##.html 规则也是如此。

    【讨论】:

      【解决方案5】:

      您可以在 ASP.net 中使用 Context.RewritePath 进行操作。

      Global.asax 中,创建一个 Application.BeginRequest 事件处理程序。

      例如,如果你想提出请求

      example.com/questions
      

      实际上从

      返回结果
      example.com/Questions/Default.aspx
      

      Global.asax

      <%@ Application Language="C#" %>
      <script runat="server">
      
         void Application_BeginRequest(Object sender, EventArgs e)
         {
             string originalPath = HttpContext.Current.Request.Path.ToLower();
      
             if (originalPath.Contains("/questions"))
             {
                 String newPath = originalPath.Replace("/questions", "/Questions/Questions.aspx");
                 Context.RewritePath(newPath);
             }
          }
      </script>
      

      如果您的网站在 .NET Framework 4 之前运行任何东西,您必须手动打开 web.config 中的 runAllManagedModulesForAllRequests,否则 BeginRequest事件不会被触发:

      <configuration>
      ...
         <system.webServer>
            <modules runAllManagedModulesForAllRequests="true" />
         </system.webServer>
      </configuration>
      

      【讨论】:

        猜你喜欢
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 2020-12-16
        • 2013-03-28
        • 1970-01-01
        • 2019-09-27
        • 2011-02-09
        相关资源
        最近更新 更多