导语
我们在IIS上经常使用 Application Request Routing (ARR) 模块做反向代理。Azure App Service 使用的也是 IIS,照理来说应该也能做反代,但默认情况下它是不行的,我们来看看如何给在 App Service 上启用 ARR。
实验
我有个网站 https://dropdatabase.run/,想要在 https://dropdatabase.run/996 下反代 https://996.icu。为此,我得在站点根目录创建以下 web.config 文件。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="996" stopProcessing="false">
<match url="996(.*)" />
<action type="Rewrite" url="https://996.icu/{R:1}" appendQueryString="true" logRewrittenUrl="false" />
</rule>
<rule name="996js" stopProcessing="false">
<match url="js/(.*)" />
<action type="Rewrite" url="https://996.icu/js/{R:1}" appendQueryString="true" logRewrittenUrl="false" />
</rule>
</rules>
</rewrite>
<httpProtocol>
<customHeaders>
<add name="strict-transport-security" value="max-age=15552001; includeSubDomains; preload" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
在本机,一切工作正常。但部署到 Azure 以后,居然404了:
其实 web.config 文件是正确的,不工作是因为 App Service 尽管已经预装了 ARR 模块,但默认并没启用。
解决方法
这是一个微软文档里没有的方法,毕竟微软产品的奇怪姿势都得靠口口相传。
要在 App Service 上启用 ARR,你需要一份 xdt 文件,并上传到 site 目录。
在网站管理页面打开 Advanced Tools
进入 Debug console, CMD 或 PowerShell
进入 site 目录
点击 New file
输入文件名 applicationHost.xdt 然后点击编辑图标
复制以下内容,并保存文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.webServer>
<proxy xdt:Transform="InsertIfMissing" enabled="true" preserveHostHeader="false" reverseRewriteHostInResponseHeaders="false" />
</system.webServer>
</configuration>
回到 Azure App Service 网站管理页面,重启网站
稍等片刻,我们的反代就能正常运行了!