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 部署txt静态文件和Jar包在不同目录中的解决办法
移动设备上的 Azure App Service 身份验证问题