【问题标题】:Proper way to fix this rewrite rule?修复此重写规则的正确方法?
【发布时间】:2018-07-25 12:49:48
【问题描述】:

我们有一个在 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>

这个规则的问题是它还会匹配“~/someothercontroller/258642/Accounting-Essentials”并将其变成“/ui/Accounting-Essentials”。而且我不想包含主机,因为主机在每个环境中都不同。

只有当表达式是主机之后的第一件事时,这需要看起来像什么?

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

您可以在我上面的规则中看到,我希望它包含 Account 之后的任何内容,但我意识到这也不完全正确,因为它不应该匹配“http://x/Accounting”,但它应该匹配“@987654324” @"。

【问题讨论】:

  • 你能举一个你想重写的完整 URL 的例子吗?
  • @Marathon55 请看编辑

标签: regex iis url-rewrite-module


【解决方案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 之后的/ 确保仅当“Account”是目录的全名时才重写 url。

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

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

编辑:另一种方式

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

  <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&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

【讨论】:

  • 好的 2 个问题。这不会阻止它匹配“x/Account”,因为 1)它不是字符串的开头吗?和 2) 因为我没有在此处包含斜杠。
  • 关于第一个问题,它是字符串的开头,假设你的Web.config文件位于http://x/。它匹配的url 是相对于Web.config 的位置。关于你问题的第二部分 - 这是一个很好的观点。它与该字符串不匹配。我会更新我的答案。谢谢!
  • 酷...仍然存在的一个问题是带有规则的 web.config 位于根网站中;不是虚拟应用程序。而且我确定它与主机 b/c 匹配,我们有一个规则,根据它们在站点中的位置更改协议,如果不存在,还会添加 www。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多