在某些.NET驱动的网站上,网址不以asp.net网页名称结尾,例如default.aspx,而是使用模式http://sitename.com或http://sitename.com/subdirectory/subdirectory。该站点被映射为根目录下的子目录,即。 / tags,/ users,/ badges,URL分别是/ tags,/ users,/ badges。
使用特定示例的Stack Overflow使用How do get clean URLs like Stackoverflow?形式的问题URL。这是优化搜索引擎页面的好方法。
这是使用HTTP处理程序实现的吗? GET请求是否根据路径进行过滤,整个响应是根据问题ID在处理程序本身中形成的?还有其他人在乎推测?
答案 0 :(得分:23)
它是ASP.Net MVC,它内置了.Net路由。路由也适用于非MVC项目,但
http://msdn.microsoft.com/en-us/library/cc668201.aspx
这只是一个.dll你可以放在bin文件夹中。基本上它使用正则表达式来匹配您的URL与页面/模板。
答案 1 :(得分:18)
这是通过Apache中的mod_rewrite或url_rewriting on IIS的类似方法实现的。
注意:SOFlow使用后者。
答案 2 :(得分:5)
在REST principles之后,网址采用该格式,其中所有内容都是具有唯一网址的资源。
我想我在博客的某个地方读到这是通过使用ASP.NET MVC framework来实现的。
答案 3 :(得分:3)
我知道Stack Overflow正在使用ASP.NET MVC框架,它可能内置了一个URL重写系统。对于非Windows系统,Apache mod_rewrite很常见。
例如,维基页面: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]
这就是说,如果输入的网址是forum-##.html
,那么就像处理forumdisplay.php?fid=##
一样处理该请求。 thread-##.html
规则也是如此。
答案 4 :(得分:0)
您可以使用Context.RewritePath
在ASP.net中执行此操作。
在 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>