修复此重写规则的正确方法?
Proper way to fix this rewrite rule?
我们有一个应用程序 运行 在 IIS 的虚拟文件夹中。我们不希望虚拟文件夹名称成为我们 link 的一部分(主要是出于 SEO 原因保留原始 link 名称)。
所以这是我们正在使用的重写规则的一个示例:
<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”。而且我不想包括主机,因为主机在每个环境中都是不同的。
仅当表达式是主机之后的第一件事时,才需要匹配什么?
编辑:
抱歉,我想我的 post 没有我想象的那么清楚。例如 http://x/Account. This should rewrite to http://x/ui/Account。 x 可以是具有任意数量句点的任何主机名,但它只是主机名,因此不会包含任何斜杠。
您可以在我上面的规则中看到,我希望它包括帐户之后的所有内容,但是我意识到这也不完全正确,因为它不应该匹配“http://x/Accounting", but it should match "http://x/Account/whatever”。
所以基本上,您要确保 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 文档给出了服务器变量值的示例:
For example, if a request was made for this URL:
http://www.example.com/content/default.aspx?tabid=2&subtabid=3, and a rewrite rule was defined on the site level then:
The rule pattern gets the URL string content/default.aspx as an input.
The QUERY_STRING server variable contains tabid=2&subtabid=3.
The HTTP_HOST server variable contains www.example.com.
The SERVER_PORT server variable contains 80.
The SERVER_PORT_SECURE server variable contains 0 and HTTPS contains OFF.
The REQUEST_URI server variable contains /content/default.aspx?tabid=2&subtabid=3.
The PATH_INFO server variable contains /content/default.aspx.
我们有一个应用程序 运行 在 IIS 的虚拟文件夹中。我们不希望虚拟文件夹名称成为我们 link 的一部分(主要是出于 SEO 原因保留原始 link 名称)。
所以这是我们正在使用的重写规则的一个示例:
<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”。而且我不想包括主机,因为主机在每个环境中都是不同的。
仅当表达式是主机之后的第一件事时,才需要匹配什么?
编辑: 抱歉,我想我的 post 没有我想象的那么清楚。例如 http://x/Account. This should rewrite to http://x/ui/Account。 x 可以是具有任意数量句点的任何主机名,但它只是主机名,因此不会包含任何斜杠。
您可以在我上面的规则中看到,我希望它包括帐户之后的所有内容,但是我意识到这也不完全正确,因为它不应该匹配“http://x/Accounting", but it should match "http://x/Account/whatever”。
所以基本上,您要确保 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 文档给出了服务器变量值的示例:
For example, if a request was made for this URL: http://www.example.com/content/default.aspx?tabid=2&subtabid=3, and a rewrite rule was defined on the site level then:
The rule pattern gets the URL string content/default.aspx as an input.
The QUERY_STRING server variable contains tabid=2&subtabid=3.
The HTTP_HOST server variable contains www.example.com.
The SERVER_PORT server variable contains 80.
The SERVER_PORT_SECURE server variable contains 0 and HTTPS contains OFF.
The REQUEST_URI server variable contains /content/default.aspx?tabid=2&subtabid=3. The PATH_INFO server variable contains /content/default.aspx.