IIS URL 重写与 URL 路由

Posted

技术标签:

【中文标题】IIS URL 重写与 URL 路由【英文标题】:IIS URL Rewriting vs URL Routing 【发布时间】:2010-09-10 13:06:19 【问题描述】:

我计划为 Web 表单应用程序使用 url 路由。但是,在阅读了一些posts 之后,我不确定这是否是一种简单的方法。

将URL Rewrite module 用于Web 表单是否更好?但是,它仅适用于 IIS7。最初,有人认为 URL 路由与 Asp.Net MVC 完全解耦,可以用于 Web 表单。

很想听听任何建议..

【问题讨论】:

对差异的良好定义。 coderjournal.com/2010/03/difference-between-routing-rewriting 【参考方案1】:

这是我找到的关于该主题的最佳文章:IIS URL Rewriting and ASP.NET routing,作者是 Ruslan Yakushev。

IIS URL 重写

当客户端向 Web 服务器请求特定 URL 时,URL 重写组件会分析请求的 URL 并将其更改为同一服务器上的其他 URL。 URL 重写组件在请求处理管道的早期运行,因此能够在 Web 服务器决定使用哪个处理程序来处理请求之前修改请求的 URL。

ASP.NET 路由

ASP.NET 路由作为托管代码模块实现,该模块在解析缓存阶段(PostResolveRequestCache 事件)和映射处理程序阶段(PostMapRequestHandler)插入 IIS 请求处理管道。 ASP.NET 路由配置为针对对 Web 应用程序发出的所有请求运行。

URL重写和ASP.NET路由的区别:

    URL 重写用于在 Web 服务器处理请求之前处理 URL 路径。 URL 重写模块不知道什么处理程序最终将处理重写的 URL。此外,实际的请求处理程序可能不知道 URL 已被重写。 ASP.NET 路由用于根据请求的 URL 路径将请求发送到处理程序。与 URL 重写相反,路由组件知道处理程序并选择应该为请求的 URL 生成响应的处理程序。您可以将 ASP.NET 路由视为一种高级处理程序映射机制。

除了这些概念上的差异之外,IIS URL 重写和 ASP.NET 路由之间还有一些功能差异:

    IIS URL 重写模块可用于任何类型的 Web 应用程序,包括 ASP.NET、php、ASP 和静态文件。 ASP.NET 路由只能用于基于 .NET Framework 的 Web 应用程序。 无论应用程序池使用集成还是经典 IIS 管道模式,IIS URL 重写模块的工作方式都相同。对于 ASP.NET 路由,最好使用集成管道模式。 ASP.NET 路由可以在经典模式下工作,但在这种情况下,应用程序 URL 必须包含文件扩展名,或者必须将应用程序配置为在 IIS 中使用“*”处理程序映射。 URL 重写模块可以根据域名、HTTP 标头和服务器变量做出重写决策。默认情况下,ASP.NET 路由仅适用于 URL 路径和 HTTP-Method 标头。 除了重写之外,URL-rewrite 模块还可以执行 HTTP 重定向、发出自定义状态代码和中止请求。 ASP.NET 路由不执行这些任务。 URL 重写模块在其当前版本中不可扩展。 ASP.NET 路由是完全可扩展和可定制的。

【讨论】:

【参考方案2】:

有一个来自 IIS 团队成员的great post here 关于两者之间的差异。

我建议的一个警告是,对于 WebForms,您在使用路由时需要小心。我编写了一个示例实现,说明您将如何使用 routing with WebForms 来解决这些问题,并希望有助于回答您的问题。

【讨论】:

【参考方案3】:

您希望格式化的网址成为生成页面的工厂吗?

或者你想让 .aspx 消失吗?

重写,是为了让.aspx消失,或者只是为了整理url。

路由,用于查看请求并确定应由哪个对象处理它。它们听起来很相似,phil haack 有几篇关于这个主题的好文章。

在iis6中,isapiRewrite,很不错

【讨论】:

原创想法:无文件扩展,搜索引擎友好,可破解的网址。我也喜欢生成新页面的想法。 :) 我喜欢 isapirewrite,但我们尽量避免使用第 3 方……这不是我的决定…… 我全心全意地同意,在较少的第 3 方中,关键是“尽可能多地”,而且 iis 7 通常比 iis 6 盒的 dll 更难销售,至少在我的客户【参考方案4】:

我最近刚刚编写了自己的重写系统,以使我网站上的 URL 看起来更好。基本上,您将需要编写自己的IHttpModule 并将其添加到您的 web.config 以拦截传入的请求。然后,您可以使用 HttpContext.Current.RewritePath 更改您指向的内容。

您还需要将您的网站配置为use the aspnet_isapi for everything。

在此过程中您会发现很多小问题,例如尝试处理在其上使用“尾部”的页面(例如 PageMethods),或页面元素的路径和表单回发,但您会解决这些问题.

如果有兴趣,我可以发布代码链接,您可以查看。我已经解决了很多问题,所以你可以随时阅读。我敢肯定还有很多其他人也做过这件事,这也可能是很好的资源。

【讨论】:

【参考方案5】:

您可能想查看我的answer 来回答这个问题:ASP.NET - Building your own routing system。我提供了一些很好的参考资料,以帮助您使用 url 重写方法或您可以使用的来自 ASP.NET MVC 项目的新路由引擎构建您自己的路由系统。

【讨论】:

【参考方案6】:

.Net 3.5 SP1 提供的动态数据项目展示了一个很好的 url 路由实现示例。

【讨论】:

有没有一个很好的概述或示例的 URL?【参考方案7】:

对于 IIS 上的 URL 重写,IIRF 在 IIS5、6、7 中工作。免费。简单。快速地。开源。正则表达式支持。

【讨论】:

以上是关于IIS URL 重写与 URL 路由的主要内容,如果未能解决你的问题,请参考以下文章

关于IIS7 URL重写的问题

url重写,IIS需要这么配置,~/aa.aspx?id=1变成~/aa_1/

iis url重写模块 是干啥用的

IIS7 URL 重写 - 添加“www”前缀

thinkphp在iis下如何写规则url重写

从 Apache (.htaccess) 到 IIS 问题的 URL 重写