【问题标题】:IIS URL Rewrite and .NET CoreIIS URL 重写和 .NET Core
【发布时间】:2018-07-25 03:00:24
【问题描述】:

我的目标是利用 IIS URL 重写来简化对用户可见的 URL 路径,但不会破坏我的核心 asp 页面引用

示例:。如果我的 IIS 将 sentoso.com/apple 重写为 sentoso.com/applications/app1/fruits/apple,我如何在 asp 应用中找到 sentoso.com/apple 的值?

asp的内部重写功能只适用于应用程序位置之后的路由,而不是应用程序本身的路径,这就是为什么我需要IIS重写才能深入到应用程序的目录。 asp rewrite 无法重写上一段中的示例。

Scott Guy 在旧版 asp 中管理了一些 RawUrl 技巧,如下所示:

https://weblogs.asp.net/scottgu/tip-trick-url-rewriting-with-asp-net

但 .NET Core 中不存在 RawUrl 属性。

【问题讨论】:

  • 你提到的那篇文章写于 2007 年。ASP.NET Core 应该不再需要这样的东西了。您应该能够使用它自己的 URL 路由。
  • 更新了我的问题
  • 在接受答案后读入 cmets,stackoverflow.com/questions/3991552/…

标签: iis asp.net-core url-rewrite-module


【解决方案1】:

具有单个域的多个网站

如果您想在 IIS 中托管多个单独的网站,您只需为每个网站输入Create a Web Site,然后为域名输入Add a Binding。 IIS 开箱即用地支持这一点,因此在这种情况下无需重写 URL。

具有多个域名的多租户网站

在这种情况下,使用 .NET 路由比 URL 重写更可取。

URL 重写在 .NET Core 中实际上已经失效。在 ASP.NET 的早期版本中需要它,因为 .aspx.ashx.asmx 处理程序是基于文件的,如果您希望 URL 与文件名不同,则必须重写传入的请求到文件名。这只是一种通过在 HTTP 请求中插入与真实值不同的值来“伪造”URL 的方法。

但重写导致了一些问题,尤其是对于依赖这些 HTTP 请求值来准确表示请求的组件。

但是,多年前创建了 ASP.NET 路由。不再伪造 HTTP 上下文 - 路由直接 到达请求的资源,无需重写和重定向。更好的是:路由管理整个应用程序的所有 URL 活动。它不仅会将传入的 URL 发送到确切的页面或操作方法,还可以用于生成 URL,以用于超链接、JavaScript、重定向等。这实际上意味着如果您更改路由的 URL,它将在应用程序中的所有位置自动更新

另一个区别是路由不会将一个 URL 映射到另一个 URL,在 MVC 中它将一个 URL 映射到 路由值 的字典。例如,您可以将 URL apple 映射到 controller="Fruits", action="Apple"。然后,当您转到 http://www.somesite.com/apple 时,MVC 将通过执行 FruitsController.Apple 操作方法来响应。

因此,对于所有现代应用程序,都使用 .NET 路由而不是 URL 重写。

参考:Routing in ASP.NET Core

【讨论】:

  • 您的答案与应用程序的“内部”路由有关,这不是我要解决的问题。我正在尝试将我的域名用作“应用程序选择器”,因此希望您能看到应用程序的内部路由表不会帮助选择哪个应用程序。我正在使用 IIS URL Rewrite 来完成一个简单的 URL 选择具有长路径重写的应用程序的行为,但是一旦 URL 被重写,应用程序本身仍然认为它位于较长的 URL,因此所有 asp 页面引用都使用较长的网址。这就是 Scott Gu 建议使用 RawURL 的地方,但在 Core 中不可用
  • 正是路由要解决的问题。您可以创建一个custom IRouter to select the tenant based on domain name(尽管该示例有点过时 - 不再有 IsHandled 属性 - 请参阅this answer 以获取修复)。
  • 当然,这假设你所有的“应用程序”都是同一个项目的一部分(Areas 可以很好地工作)。如果您有多个应用程序,IIS 和其他 Web 服务器已经允许您为每个应用程序配置单独的域名 - 在这种情况下也没有理由使用重写。
  • 是的,我想你在这里仍然没有达到我的目标。让我们回顾一下。我的目标是仅按域选择应用程序。选项 1) .NET 路由,仅适用于应用程序,在这里没有帮助。 2)虚拟目录,不要完全命中标记,因为域并不决定应用程序,VD的名称是。 3) IIS 重写规则,有效,但搞砸了应用程序的页面引用。如果您能阐明一个可行的解决方案,我将不胜感激。
  • Also 4) 单个站点级别的 IIS 绑定不允许多个域,但甚至不确定这对我的目标是否有效
猜你喜欢
  • 2018-03-26
  • 1970-01-01
  • 2011-06-19
  • 2011-05-23
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2013-07-01
相关资源
最近更新 更多