Azure App Service 存在于子目录中时,如何设置其默认文档?

Posted

技术标签:

【中文标题】Azure App Service 存在于子目录中时,如何设置其默认文档?【英文标题】:How do I set the default document of an Azure App Service when it exists in a subdirectory? 【发布时间】:2019-02-19 14:10:28 【问题描述】:

我正在通过发布管道从 Azure DevOps 部署 Azure 应用服务,该发布管道配置为在我的构建代理上执行 Azure 应用服务部署任务。部署任务以我的应用服务的根目录为目标,因此它将部署在我的“\site\wwwroot\”文件夹中。

我的项目是一个 Laravel php Web 应用程序,所以默认文档设置为 'index.php'。我的应用程序部署到“\site\wwwroot\”,但设置为默认文档的“index.php”文件的位置在“\site\wwwroot\”中。

不是什么大问题,对吧?只需将应用程序目录设置为“\site\wwwroot\public”,该应用程序就可以运行,因为它现在可以找到我的默认文档 (index.php)。除了有一个问题。

当 Azure DevOps 部署到 Azure 应用服务时,它将部署到您在 Azure 中设置的应用程序目录。因为我的根现在设置为 '\site\wwwroot\public' 以更正查找默认文档的问题,AzureDevops 正在将后续构建部署到 '\site\wwwroot\public' 文件夹。

理想情况下,我想将我的“index.php”文件保存在“\site\wwwroot\public”文件夹中,因为当我将其移动到项目的根目录时会导致问题。我似乎不知道如何告诉 Azure 在我的公用文件夹中查找默认文档。我是否需要编写一个 web.config 并将其放在我的项目根目录中以便 IIS 找到它?


更新:

我仍在尝试解决我遇到的这个问题。我无法配置 Azure 或 Azure DevOps 来区分我的应用程序部署到的目录和提供我的应用程序的目录。

我不能简单地创建两个虚拟应用程序,因为这会将我的根目录暴露给该端点。我需要能够简单地指示 Azure DevOps 将我的应用程序放在 Web 应用程序的哪个位置。

【问题讨论】:

对于任何知道如何将 index.php 文件移动到 Laravel 项目根目录的人,我也愿意这样做。我编辑了我的 index.php 以从 DIR.'/bootstrap' 加载,但是我现在在我的所有公共资源(app.css、app.js)上都得到了 404。 将 Laravel 根文件夹中的 server.php 重命名为 index.php @JigneshJoisar 现在我的 app.css 和 app.js 是空的。现在没有 404,只是空资源。 我们遇到了完全相同的问题。你找到解决方案了吗? 我目前正在等待 Azure 支持技术人员回复我。我为这个问题添加了一个答案,但它似乎并不完全是我想要的。我在 Azure App Service 文档中的某处发现必须将 index.php 放在根目录中。 【参考方案1】:

由于将应用程序目录设置为“\site\wwwroot\public”后可以正常工作,因此您可以添加一个物理路径为“site\wwwroot\public”的新虚拟应用程序,而不是更改原来的虚拟应用程序。

那么,有两项,例如:

关于通过 Azure DevOps 进行部署,只需将应用部署到该应用服务(站点\wwwroot)即可。

之后,您可以通过[应用服务网址]\PHP访问您的应用。

【讨论】:

这不起作用,因为将 'site\wwwroot' 的物理路径暴露给 '/' 的虚拟路径会暴露我在项目根目录中的所有文件。这也不起作用,因为我的应用程序未配置为使用 /PHP 或其他任何虚拟路径进行路由。【参考方案2】:

您可以通过为您的 Azure 应用服务提供 Kudu 环境变量来指定从 Azure DevOps(或 Git、BitBucket 等)部署源代码的位置。请参阅在 Azure 门户的“应用程序设置”部分为我的 Azure 应用服务配置的以下环境变量。

这使我可以指示代码的部署位置。否则,Kudu 的默认源代码管理路径似乎取自您的虚拟应用程序路径。

进一步阅读: https://github.com/projectkudu/kudu/wiki/Deploying-inplace-and-without-repository


更新:

看起来,虽然您能够使用 Kudu 环境变量配置代码部署的位置,但您仍然受限于虚拟应用程序的文件夹名称。

例如,如果我将 SCM_TARGET_PATH 设置为\home\sites\app,并且我有一个虚拟应用程序,其虚拟路径为/,物理路径为\home\sites\app\public,Azure DevOps 会将您的代码部署到\home\sites\app\public 和不是预期的\home\sites\app

这是一个巨大的不便,我无法托管我的 Laravel 应用程序,因为我的持续部署不会像 Azure 目前的工作方式那样工作。我必须将我的代码发布到 Docker 容器并改用它(我不想这样做)。

【讨论】:

真正的解决方案有什么进展吗? 不幸的是,没有。 Microsoft 的团队只希望您将项目更改为托管在根文件夹之外。您不能从 wwwroot 的子目录中的文件托管。【参考方案3】: 将 server.php 重命名为 index.php

将 .htaccess 从公用文件夹复制到根文件夹

更改 .htaccess :

RewriteEngine On
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

RewriteCond %REQUEST_URI !(\.css|\.js|\.png|\.jpg|\.gif|robots\.txt)$ [NC]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^ index.php [L]

RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_URI !^/public/
RewriteRule ^(css|js|images)/(.*)$ public/$1/$2 [L,NC]

更改为函数 /Illuminate/Foundation/helpers.php/asset() 函数 如下:

function asset($path, $secure = null)

    return app('url')->asset("public/".$path, $secure);

【讨论】:

抱歉,不走运。找不到我的css和js。该应用程序可以很好地从我的刀片模板加载 html,但找不到“/css”或“/js”文件夹。看起来 server.php 仅用于开发目的,所以我宁愿找到一种使用常规方法解决问题的方法。 @ColinLaws 试试最后一种方法 我不能直接修改 Laravel 框架,这会导致可维护性问题。这是用于生产,而不是临时用于开发的黑客如果我更改了该文件,这些更改将如何反映在我的存储库中?他们不能。这是一个作曲家依赖。 我同意,这最好在 Azure 端解决,但我无法区分应用程序的根文件夹和包含我的默认文档的文件夹。 出于安全原因和公共资产文件的分离 laravel 使用公共文件夹

以上是关于Azure App Service 存在于子目录中时,如何设置其默认文档?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 应用服务如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?

在Azure App Service上启用gzip压缩

Azure 应用服务App Service 部署txt静态文件和Jar包在不同目录中的解决办法

移动设备上的 Azure App Service 身份验证问题

使用Azure Functions在Azure blob中运行exe

Azure App Service for Linux是否支持http2?