添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
爱运动的灌汤包  ·  C ...·  1 年前    · 
逃跑的单杠  ·  X-MOL·  1 年前    · 

设置测试网页

为了演示 URL 重写模块 2 的工作原理,你将使用一个简单的 ASP.NET 页。 此页读取 Web 服务器变量并在浏览器中显示其值。 它还使用服务器变量生成超链接,然后将该链接放入响应 HTML 中。

创建测试页

  • 在以下文件夹中创建一个名为 article.aspx 的文件:

    %SystemDrive%\inetpub\wwwroot\
    
  • 复制以下 ASP.NET 标记,将其粘贴到文件中,并保存该文件:

    <%@ Page Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>URL Rewrite Module v2 Test</title>
    </head>
        <h1>URL Rewrite Module v2 Test Page</h1>
        <h2>Inbound URL Rewriting</h2>
        <table>
                <th>Server Variable</th>
                <th>Value</th>
                <td>Original URL: </td>
                <td><%= Request.ServerVariables["UNENCODED_URL"] %></td>
                <td>Final URL: </td>
                <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
        </table>
        <h2>Outbound URL Rewriting</h2>
            <a href="<%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>">Here</a> is the link to this article.
    </body>
    </html>
    
  • 打开 Web 浏览器并请求以下 URL,以确保页面正确呈现:

    http://localhost/article.aspx
    

    添加入站重写规则

    下一步是添加一个规则,用于重写采用以下格式的 URL:

    http://localhost/article/342/some-article-title
    

    这些 URL 将重写为采用如下格式:

    http://localhost/article.aspx?id=342&title=some-article-title
    

    若要添加入站重写规则,请执行以下操作:

  • 打开位于以下位置的 web.config 文件:

    %SystemDrive%\inetpub\wwwroot\
    
  • /configuration/system.webServer 元素下添加以下内容,然后保存文件:

    <rewrite>
      <rules>
        <rule name="Rewrite to article.aspx">
          <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
          <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
        </rule>
      </rules>
    </rewrite>
    

    有关创建入站重写规则的详细信息,请参阅为 URL 重写模块创建重写规则

    测试入站重写规则

    现在可以测试入站重写规则是否按设计运行。

    若要测试入站重写规则,请执行以下操作:

    打开 Web 浏览器并请求以下 URL:

    http://localhost/article/342/some-article-title
    

    如果重写规则正常工作,你将从服务器收到如下所示的响应:

    可以看到,由于入站规则,可以使用简单且用户友好的 URL 结构来访问此网页。 但是,如果用户单击 HTML 页中的超链接,Web 浏览器将使用带有查询字符串参数的 URL。 出于多种原因,这并不是理想方式:

  • 网站访问者会看到你想要使用 URL 重写规则隐藏的内部 URL 结构。
  • 同一页可以通过多个 URL 访问,这对于搜索引擎优化而言并不理想。
  • 解决此问题的最直接方法是修改 HTML 页以使用简单的链接结构。 但是,在许多情况下做不到这一点。 例如,如果已有一个复杂的传统 Web 应用程序或无法修改的 Web 应用程序,则修复应用程序中所有 URL 链接的任务可能非常耗时,或者根本不可行。

    这时,出站 URL 重写便可以发挥作用。 出站 URL 重写可以即时修复应用程序生成的响应中的链接。

    创建出站重写规则

    现在,你将创建一个出站重写规则来更改 HTML 响应中的 URL。 该规则将更改采用以下格式的 URL:

    http://localhost/article.aspx?id=342&title=some-article-title
    

    这些 URL 将重写为以下内容:

    http://localhost/article/342/some-article-title
    

    你将使用 IIS 管理器中的“URL 重写”用户界面创建出站规则。

    若要创建出站规则,请执行以下操作:

  • 打开 IIS 管理器
  • 选择“默认网站”
  • 在功能视图中,选择“URL 重写”
  • 在右侧的操作窗格中,单击“添加规则...”。 在“添加规则”对话框中,选择“出站规则”类别下的“空白规则”,然后单击“确定”。

    现在必须定义实际的出站规则。 在 URL 重写模块 2.0 中,出站重写规则是通过指定以下信息来定义的:

  • 规则名称。
  • 用于控制是否应将此规则应用于响应的可选前提条件。
  • 用于匹配响应中的字符串的模式。
  • 一组可选条件。
  • 当模式匹配并且所有条件检查都成功时要执行的操作。
  • 为规则命名

    在“名称”文本框中输入用于唯一标识该规则的名称,例如:“重写为干净 URL”。

    定义前提条件

    前提条件用于评估是否应对响应执行出站规则评估。 例如,如果修改 HTML 内容的规则,则仅应根据此规则评估内容类型标头设置为“text/html”的 HTTP 响应。 出站规则评估和内容重写是 CPU 密集型操作,可能会对 Web 应用程序的性能产生负面影响。 因此,在应用出站规则时,请使用前提条件来缩小范围。

    由于创建的规则应仅应用于 HTML 响应,因此需要定义一个前提条件来检查 HTTP 响应头 content-type 是否等于“text/html”。

    若要定义前提条件,请执行以下操作:

  • 在“前提条件”列表中,选择“创建新的前提条件”<>。

  • 随即你会转到“前提条件编辑器”对话框,需要在其中定义前提条件。 如下所述指定前提条件设置:

  • 名称:“IsHTML”

  • 使用:“正则表达式”

  • 单击“添加”以显示“添加条件”对话框。 在此对话框中,指定:

  • 条件输入:“{RESPONSE_CONTENT_TYPE}”

  • 检查输入字符串:“匹配模式”

  • 模式:“^text/html”

    出站重写规则可以对 HTTP 标头的内容或响应正文内容进行操作。 该规则需要替换响应内容中的链接,因此请在“匹配范围”下拉列表中选择“响应”。

    定义标记筛选器

    标记筛选器用于将模式匹配范围限定为仅与特定 HTML 元素匹配,而不是根据规则的模式评估整个响应。 模式匹配是一项非常消耗 CPU 资源的操作,如果根据模式评估整个响应,可能会显著减慢 Web 应用程序的响应速度。 标记筛选器允许指定仅在某些 HTML 标记的内容中应用模式匹配,从而显著减少必须根据正则表达式模式进行评估的数据量。

    若要定义标记筛选器,请展开下拉列表“匹配以下范围的内容:”,然后选中复选框“A (href 属性)”

    这会将规则设置为仅将模式应用于超链接的 href 属性值,如以下示例所示:

    <a href="this string will be used for pattern matching">Some link</a>
    

    在“模式”文本框中输入以下字符串:

    ^/article\.aspx\?id=([0-9]+)(?:&|&amp;)title=([_0-9a-z-]+)$
    

    此字符串是一个正则表达式,指定模式将匹配任何满足以下条件的 URL 字符串:

  • 以字符序列“/article.aspx?”开头。
  • 包含具有数值的第一个查询字符串参数。
  • 包含具有字母数字值的第二个查询字符串参数。
  • 请注意,正则表达式的某些部分包含在括号中。 这些括号创建一个捕获组,稍后可以使用反向引用在规则中引用该捕获组。 此外,在大多数情况下,“&”符号是在响应中进行 HTML 编码的,因此正则表达式模式需要考虑到这一点。

    在“操作”组框中选择“重写”操作类型。 在“值”文本框中,输入以下字符串:

    /article/{R:1}/{R:2}
    

    此字符串指定链接地址应重写为的新值。 请注意,对于查询字符串参数值,表达式使用了 {R:1} 和 {R:2},它们是对使用括号在规则模式中定义的捕获组的反向引用。

    保留所有其他设置的默认值。 “编辑规则”属性页将如下所示:

    单击右侧的“应用”操作保存规则。

    查看配置文件中的重写规则

    重写规则存储在 aplicationHost.config 文件或 web.config 文件中。 若要检查我们刚刚创建的规则的配置,请打开 web.config 文件,该文件位于

    %SystemDrive%\inetput\wwwroot\
    

    在此文件中,你将看到包含所有规则定义的 <rewrite> 部分,如以下示例所示:

    <rewrite>
     <rules>
      <rule name="Rewrite to article.aspx">
       <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
       <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
      </rule>
     </rules>
     <outboundRules>
      <rule name="Rewrite to clean URL" preCondition="IsHTML">
       <match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&amp;|&amp;amp;)title=([_0-9a-z-]+)$" />
       <action type="Rewrite" value="/article/{R:1}/{R:2}" />
      </rule>
      <preConditions>
       <preCondition name="IsHTML">
        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
       </preCondition>
      </preConditions>
     </outboundRules>
    </rewrite>
    

    现在可以测试规则是否正确重写 URL。 打开 Web 浏览器并请求以下 URL:

    http://localhost/article/342/some-article-title
    

    应会看到出站重写规则已更改 HTML 响应中的链接:

    现在,如果站点访问者单击此链接,将使用干净的 URL 格式,并且不会显示此页使用的内部 URL 表示形式。

    在本演练中,你已了解如何使用 IIS 管理器或通过手动编辑 web.config 文件在 URL 重写模块 2.0 中配置出站重写规则。 本演练中创建的规则演示了 URL 重写模块 2.0 的一些重要功能,例如出站重写、前提条件和标记筛选器。

  •