ASP.NET URL Rewrite规则调整:HTTP转HTTPS时补全路径前缀
解决ASP.NET Rewrite中HTTP转HTTPS丢失路径前缀的问题
当然可以在重定向规则的URL中混合使用{HTTP_HOST}这类服务器变量和硬编码文本,这完全是支持的,而且刚好能解决你现在遇到的路径缺失问题。
你的核心问题是重定向后丢失了/ExitInterview这个路径前缀,只需要调整规则里的action节点的url属性,把这个前缀加进去,同时保留{HTTP_HOST}来适配不同环境的主机名,保留{R:1}来复用原请求的路径部分。
方案一:直接混合变量与硬编码文本
修改后的规则如下:
<rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/ExitInterview/{R:1}" redirectType="Permanent" /> </rule>
这样一来,不管是本地、staging还是生产环境,{HTTP_HOST}会自动获取当前请求的主机域名,硬编码的/ExitInterview会被添加到路径开头,{R:1}则会带上原请求里的后续路径(比如home/about),最终就能生成你期望的https://services.net/ExitInterview/home/about这类地址。
方案二:用服务器变量自动获取虚拟目录(更灵活)
如果ExitInterview是你的应用所在的虚拟目录名称,还可以用{APPL_MD_PATH}这个服务器变量来自动获取虚拟路径,这样连硬编码前缀都不需要,后续虚拟目录名称变化时也不用修改规则:
<rule name="HTTP to HTTPS redirect" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="off" ignoreCase="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{APPL_MD_PATH}/{R:1}" redirectType="Permanent" /> </rule>
{APPL_MD_PATH}会自动返回当前应用程序的虚拟目录路径(比如/ExitInterview),这样规则的适配性更强,完全不用关心不同环境的虚拟目录差异。
两种方案可以根据你的实际场景选择:如果/ExitInterview是固定的业务路径前缀,方案一更直接;如果是虚拟目录,方案二更灵活。
内容的提问来源于stack exchange,提问作者Steve Scott
相关产品推荐
相关产品推荐

