正确的方法来修复此重写规则?

时间:2018-02-14 20:39:27

标签: regex iis url-rewrite-module

我们有一个在IIS中的虚拟文件夹中运行的应用程序。我们不希望虚拟文件夹名称成为我们链接的一部分(主要是为了保留原始链接名称,因为SEO原因)。

所以这是我们正在使用的重写规则的一个例子:

      <rule name="Rewrite Account controller to UI">
        <match url="/Account(.*)"/>
        <action type="Rewrite" url="ui/Account{R:1}"/>
        <conditions>
          <add input="{URL}" pattern="\.axd$" negate="true" ignoreCase="true"/>
        </conditions>
      </rule>

这条规则的问题在于它也会匹配&#34;〜/ someothercontroller / 258642 / Accounting-Essentials&#34;并将其转换为&#34; / ui / Accounting-Essentials&#34;。而且我不想包含主机,因为每个环境中的主机都不同。

只有当表达式是主机之后的第一个东西时,这需要匹配才会匹配吗?

编辑: 对不起,我想我的帖子并不像我想象的那样清晰。一个例子是http://x/Account。这应该重写为http://x/ui/Account。 x可以是具有任意数量句点的任何主机名,但它只是主机名,因此它不会包含任何斜杠。

你可以在我上面的规则中看到,我希望它包含在Account之后的任何内容,但是我意识到它不太正确,因为它不应该匹配&#34; {{3 }&#34;,但它应匹配&#34; http://x/Accounting&#34;。

1 个答案:

答案 0 :(得分:1)

基本上,您希望确保Account紧跟在主机之后,并且Account是目录的全名。你可以这样做:

  <rule name="Rewrite Account controller to UI">
    <match url="^Account(/.*)?"/>
    <action type="Rewrite" url="ui/Account{R:1}"/>
    <conditions>
      <add input="{URL}" pattern="\.axd$" negate="true" ignoreCase="true"/>
    </conditions>
  </rule>
  • ^确保这是您正在评估的字符串的开头。
  • /之后的Account确保您只有在“帐户”是目录的全名时才会重写网址。

the documentation看来,初始/将不会包含在您正在评估的字符串中(这就是我删除它的原因),但您可以通过两种方式对其进行测试。

另请注意,我在/之前添加了{R:1}

编辑:另一种方式

您还可以添加一条规则,验证整个网址是否与特定模式匹配。这实际上可能是一种更简单的方法:

  <rule name="Rewrite Account controller to UI">
    <match url="/Account(.*)"/>
    <action type="Rewrite" url="ui/Account{R:1}"/>
    <conditions>
      <add input="{URL}" pattern="\.axd$" negate="true" ignoreCase="true"/>
      <add input="{REQUEST_URI}" pattern="^/Account(/.*)?" ignoreCase="true"/>
    </conditions>
  </rule>

Microsoft文档提供了服务器变量值的示例:

  

例如,如果对此URL发出了请求:    http://www.example.com/content/default.aspx?tabid=2&subtabid=3 ,然后在网站级别定义了重写规则:

     
      
  • 规则模式将URL字符串 content / default.aspx 作为输入。

  •   
  • QUERY_STRING服务器变量包含 tabid = 2&amp; subtabid = 3

  •   
  • HTTP_HOST服务器变量包含 www.example.com

  •   
  • SERVER_PORT服务器变量包含 80

  •   
  • SERVER_PORT_SECURE服务器变量包含 0 ,HTTPS包含 OFF

  •   
  • REQUEST_URI服务器变量包含 /content/default.aspx?tabid=2&subtabid=3 。   PATH_INFO服务器变量包含 /content/default.aspx

  •