【问题标题】:How to tell IIS7 to redirect traffic to asp.net如何告诉 IIS7 将流量重定向到 asp.net
【发布时间】:2026-01-20 06:45:01
【问题描述】:

我在global.asax 中有一个 url 重写例程,当用户键入时:

http://example.com/products/category/electronics

服务器服务:

http://example.com/products.aspx?category=45

问题是IIS7没有发送这个请求由asp.net处理,因为请求的路径在目录结构中没有文件夹。

如何告诉 IIS 让 asp.net 处理此请求,而不为每个产品和类别创建目录?

【问题讨论】:

  • 为什么不直接使用 MVC,因为它内置了开箱即用的功能?哄 IIS7 来做这件事,而不是使用已经存在的东西似乎是徒劳的。
  • @joel - OP 显然致力于 ASP.NET 表单,告诉他/她“只使用 MVC”是没有建设性的。 IIS7 的 URL 重写模块是这里的明确解决方案。
  • @ Kev Ω - 我不是,否则我会回答的。我在问是否有不能使用它的原因。我想在开始研究替代方案之前知道这一点方法。我可以看到如何以这种方式解释我的评论,但它不是这样的。我更感兴趣的是首先隔离限制。

标签: asp.net iis iis-7 url-rewriting


【解决方案1】:

从技术上讲,您没有 IIS 执行此操作,您使用 URL 重写来执行此操作。这是 ASP.NET MVC 的正常特性。但是,在“经典”基于表单的 asp.net 中也是可能的。

这里有一篇关于它的文章:http://msdn.microsoft.com/en-us/library/ms972974.aspx

文章中列出了实现此目的的多种方法,以及编写 httpModule 的详细说明。

事实上,这篇文章展示了如何完全按照您的要求去做。在页面上搜索“当用户访问 /Products/Beverages.aspx 时”,它会带您直接演示它是如何工作的。 (说明在文章的较高位置。)

【讨论】:

  • 这个链接非常有用,谢谢。也许 httpmodule 对我来说可能是最好的方式。因为我从来没有写过,所以我不得不玩弄它。
【解决方案2】:

简而言之,不要在您的Global.asax 中这样做。改用 IIS7 Url Rewriter:

Using the URL Rewrite Module

您有两种解决方案之一 -

  1. 使用 URL Rewrite Map 并将每个类别名称映射到类别 ID:

    <rewrite>
      <rewriteMaps>
        <rewriteMap name="StaticRewrites">
          <add key="/products/category/electronics" value="/products.aspx?category=45" />
          <add key="/products/category/books" value="/products.aspx?category=46" />
          <add key="/products/category/dvds" value="/products.aspx?category=47" />
        </rewriteMap>
      </rewriteMaps>
      <rules>
        <rule name="Rewrite Rule 1 for StaticRewrites" stopProcessing="true">
          <match url=".*" />
          <conditions>
            <add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
          </conditions>
          <action type="Rewrite" url="{C:1}" appendQueryString="False"/>
        </rule>
      </rules>
    </rewrite>
    
  2. 使用更“动态”的重写:

    <rewrite>
      <rules>
        <rule name="RedirectUserFriendlyURL1" stopProcessing="true">
          <match url="^products\.aspx$" />
          <conditions>
            <add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" />
            <add input="{QUERY_STRING}" pattern="^([^=&amp;]+)=([^=&amp;]+)$" />
          </conditions>
          <action type="Redirect" url="products/{C:1}/{C:2}" appendQueryString="false" />
        </rule>
        <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
          <match url="^products/([^/]+)/([^/]+)/?$" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="products.aspx?{R:1}={R:2}" />
        </rule>
      </rules>
    </rewrite>
    

    在上述情况下,您需要更改 products.aspx 页面以接受类别名称,然后在该页面中查找数据库中类别的实际整数 ID。

将重写职责传递给 IIS7 的 URL 重写模块(或任何其他重写器,例如 Iconics IIRF 或 HeliconTech 的 ISAPI 重写)意味着您可以单独更改这些规则,而不是将它们刻录到您的代码中。将这些规则刻录到您的代码中意味着您必须在每次进行更改时重新部署。

【讨论】:

  • 谢谢大家的回答。 ASP.NET MVC 不是不可能的,我只是还没有使用它,所以我觉得无法像现有项目那样进行更改(除非你说超级简单)。我将尝试 IIS7 的 Url Rewrite。但我宁愿在代码中而不是在配置文件中处理它,因为查找表可以通过数据库完成,不需要我更改代码,而是更新数据库。再次感谢。