在规则中包含目录的一种方法是排除其他所有内容。
假设 其他所有内容 具有文件扩展名(例如 .php、.css、.js 等),您可以否定路径中包含 . 的所有输入。
我稍微更改了您的代码以在本地制作一个有效的演示(我没有在本地测试 HTTPS,因此我没有重定向到 HTTP,而是将其设置为重定向到 About.aspx),两条规则是:
<rule name="HTTPS" enabled="true" stopProcessing="true">
<match url=".*\.(asp)$" ignoreCase="false" />
<action type="Redirect" url="/About.aspx" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="NEWRULE" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_URI}" negate="true" pattern=".*\.(.)$" ignoreCase="true" />
<add input="{REQUEST_URI}" negate="true" pattern="^/About*" ignoreCase="true" />
</conditions>
<action type="Redirect" url="/About.aspx" appendQueryString="true" redirectType="Permanent" />
</rule>
因此,根据您的原始代码示例,适用于您的新规则将类似于:
<rule name="IncludeDirectories" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{REQUEST_URI}" negate="true" pattern=".*\.(.)$" ignoreCase="true" />
<add input="{HTTPS}" pattern="on" />
<add input="{REQUEST_URI}" negate="true" pattern="^/ecards/user*" ignoreCase="true" />
</conditions>
<action type="Redirect" url="http://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
注意:上述方法比较激进。你可以替换这个条件:
<add input="{REQUEST_URI}" negate="true" pattern=".*\.(.)$" ignoreCase="true" />
以下内容:
<add input="{REQUEST_URI}" negate="true" pattern=".*\.(php|css|js|jpg|gif|png)$" ignoreCase="true" />
排除特定扩展名的地方。您想添加多少就添加多少。
编辑:如果您想让特定页面仍然使用 HTTPS,那么以下规则可能会有所帮助(虽然尚未测试)。上一条规则将所有 URL 发送到 HTTP,除了那些具有 /ecards/user 的 URL,此规则将具有 /ecards/user 的 URL 发送到 HTTPS。我相信不会有冲突。
<rule name="HTTPS2Admins" enabled="true" stopProcessing="true">
<match url="/ecards/user(.*)" />
<conditions>
<add input="{HTTP}" pattern="on" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/ecards/user{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>