22

在一些 .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 在处理程序本身中形成的?还有人愿意推测吗?

4

5 回答 5

23

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

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

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

于 2009-06-23T21:11:59.340 回答
18

这是通过Apache 中的mod_rewrite或IIS 上类似的 url_rewrite方法实现的。

注意:SOFlow 使用后者。

于 2009-06-23T21:11:24.677 回答
5

URL 采用遵循REST 原则的格式,其中所有内容都是具有唯一 URL 的资源。

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

于 2009-06-23T21:12:51.443 回答
3

我知道 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]

这说明如果进入的 URLforum-##.html然后处理该请求,就好像它是forumdisplay.php?fid=##. thread-##.html规则也是如此。

于 2009-06-23T21:12:46.063 回答
0

您可以在 ASP.net 中使用Context.RewritePath.

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

例如,如果您想提出以下请求

example.com/questions

实际返回结果

example.com/Questions/Default.aspx

全球.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.configrunAllManagedModulesForAllRequests,否则BeginRequest事件不会被触发:

<configuration>
...
   <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
   </system.webServer>
</configuration>
于 2016-04-04T00:52:55.560 回答