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

Regex 修复此重写规则的正确方法?,regex,iis,url-rewrite-module,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}"/>

我们有一个在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。我不想包括主机,因为主机在每个环境中都是不同的

只有当表达式位于宿主之后的第一件事时,才需要什么样的匹配

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


你可以在我上面的规则中看到,我希望它包含在Account之后的任何内容,但是我意识到这也不太正确,因为它不应该匹配,但应该匹配。

所以本质上,你需要确保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>
Microsoft文档给出了以下服务器变量值示例:

例如,如果请求此URL: ,然后在站点级别定义了重写规则:

规则模式获取URL字符串content/default.aspx作为输入

QUERY_STRING服务器变量包含tabid=2和subtabid=3

HTTP_主机服务器变量包含www.example.com

服务器端口服务器变量包含80

SERVER\u PORT\u SECURE SERVER变量包含0,HTTPS包含OFF

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


你能给出一个你想重写的完整URL的例子吗?@Marathon55请参见editOk 2问题。这是否会阻止它匹配,因为它不是字符串的开头,是吗?2,因为我没有在这里包含一个尾随斜杠。关于第一个问题,假设您的Web.config文件位于http://x/. 它所匹配的url相对于Web.config的位置。关于你问题的第二部分,这是一个很好的观点。它与那个字符串不匹配。我会更新我的答案。谢谢凉的还有一个问题是web.config的根网站中有规则;不是虚拟应用程序。我确信它与主机b/c相匹配。我们有一个规则,根据它们在站点中的位置来更改协议,如果不在,也会添加www。
  <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>