将子域映射到虚拟目录 Azure WebApps

Map subdomain to virtual directory Azure WebApps

我试图在单个 Azure WebApp 中托管多个网站,而不是让多个 Web 应用程序各自托管一个站点。这些站点中的每一个都相当小,但是为了满足 Azure 的 SLA 要求,我们需要为我们的生产环境将服务器扩展为多个实例,因此合并站点的原因。

在研究了这个主题之后,我对我们的 Azure 帐户进行了以下设置。

  1. 在我们的区域管理器中创建了正确的 CNAME DNS 记录(完整且有效)。
  2. 设置 Azure WebApp 以响应子域(已完成且有效)。
  3. 为第二个 web 应用程序设置一个虚拟目录(完成并工作)

此时,两个 Web 应用程序都正常运行并且两个子域都指向我们的 Azure 实例。我们现在有以下设置:

我想达到的目标:

但是,我不知道如何将子域映射到特定的虚拟目录。我尝试将站点 URL 更新为我希望应用程序响应的子域,但是,该子域仍然会显示我在 WebApp 部署的根目录中拥有的任何内容。

我是否应该在站点根目录中安装一些 HttpHandler 并将流量定向到正确的虚拟目录?门户中是否缺少我缺少的设置?以前,我们使用 Web 角色完成此操作并修改 ServiceDefinition 文件,但 Azure Web 应用程序在发布、与源代码管理集成等方面的工具集似乎更进一步。

这可能与 URL 重写规则有关,该规则采用请求的主机名并重写请求 URL 以从主机名中提取的子域开始:

 <system.webServer>
    <rewrite>
        <rules>
            <rule name="Rewrite Subdomain To Directory">
                <match url=".*" />
                <conditions>
                    <add input="{HTTP_HOST}" pattern="^www\.mydomain\.com$" negate="true" />
                    <add input="{HTTP_HOST}" pattern="^(.+)\.mydomain.\com$" />
                </conditions>
                <action type="Rewrite" url="{C:1}/{R:0}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

要了解重写规则的语法,您可以参考 IIS.net documentation about URL rewrite module

RuslanY 发布的答案将有效(对规则稍作修改)但是,在了解更多 Azure 门户和 Web 应用程序配置后,不需要在单个 Web 应用程序中托管多个站点(它的从技术上讲,多个 Web 应用程序都共享您定义的资源计划,例如标准级别 0 (S0))* 的 2 个实例。

对于今天的 Azure 服务产品,以下内容为真。当您创建一个新的 Web 应用程序时,您指定应用程序所属的 "App Service Plan"。如果您有一个 App Service 计划,假设有 2 个实例的 Standard,您部署到该 App Service 计划的任何 Web App 都会与同一服务计划中的其他 Web 应用共享这些资源,这意味着您无需支付额外费用来托管额外的 Web应用 如果它在同一个应用服务计划中。我曾假设每个 Web 应用程序都是自己的一组资源(可以,但不一定是)。鉴于此,为了完成我的需要,我只需为每个子域创建一个 Web 应用程序并将它们全部放入同一个应用程序服务计划中。我现在托管多个站点,而不是为每个站点支付 2 台服务器的费用(我想避免的),而且我不必使用 URL 重写或 HTTP 处理程序。

我希望这篇文章能帮助其他人更好地理解 Azure Web 应用程序的结构。目前的在线文档,据我所知,并没有完全清楚这一点。