我们有一个在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;。
答案 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 。