如何正确格式化 app.yaml 以使用 PHP 后端托管 Flutter Web 应用程序
Posted
技术标签:
【中文标题】如何正确格式化 app.yaml 以使用 PHP 后端托管 Flutter Web 应用程序【英文标题】:How to properly format app.yaml to host Flutter web app with PHP backend 【发布时间】:2020-08-20 15:12:58 【问题描述】:我正在尝试为带有 php 后端的 Flutter Web 应用程序创建一个 .yaml 文件,但遇到了奇怪的问题。
应用结构如下:
flutter 应用位于 Admin/web/ 中,包含各种文件类型,但没有 php 文件。登陆页面是 index.html。
PHP 后端位于 Admin/ 中。所有 PHP 文件都需要来自 Admin/
它当前加载 index.html,但由于某种原因,当我尝试 website.com/manifest.json 时,我再次获得了 index.html。这同样适用于 FontManifest.json——它给了我 index.html。
它确实适用于网站根目录(website.com/)、index.html 和 main.dart.js——对应的文件被准确传输。
这是我的 .yaml 文件:
service: admin
runtime: php72
handlers:
- url: /(.+\.(ico|jpg|png|gif))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(ico|jpg|png|gif))$
login: admin
secure: always
- url: /(.+\.(htm|html|css|js|json|map|ttf|dart))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(htm|html|css|js|json|map|ttf|dart))$
login: admin
secure: always
- url: /(.+\.php)$
static_files: Admin/\1
upload: Admin\/(.+\.php)$
login: admin
secure: always
- url: /(.*)$
static_files: Admin/web/index.html
upload: Admin/web/(.*)$
login: admin
secure: always
我注意到页面立即从 website.com/ 重定向到 website.com/#/,所以我也尝试了这个 .yaml 文件:
service: admin
runtime: php72
handlers:
- url: /(.+\.(ico|jpg|png|gif))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(ico|jpg|png|gif))$
login: admin
secure: always
- url: /#/(.+\.(ico|jpg|png|gif))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(ico|jpg|png|gif))$
login: admin
secure: always
- url: /(.+\.(htm|html|css|js|json|map|ttf|dart))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(htm|html|css|js|json|map|ttf|dart))$
login: admin
secure: always
- url: /#/(.+\.(htm|html|css|js|json|map|ttf|dart))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(htm|html|css|js|json|map|ttf|dart))$
login: admin
secure: always
- url: /(.+\.php)$
static_files: Admin/\1
upload: Admin\/(.+\.php)$
login: admin
secure: always
- url: /(.*)$
static_files: Admin/web/index.html
upload: Admin/web/(.*)$
login: admin
secure: always
不过,使用这个 .yaml 文件,我得到了相同的结果。
编辑 我意识到由于处理程序的顺序,以前的 .yaml 文件会产生与原始文件相同的结果,因此我尝试了以下操作(并得到了相同的结果):
service: admin
runtime: php72
handlers:
- url: /#/(.+\.(ico|jpg|png|gif))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(ico|jpg|png|gif))$
login: admin
secure: always
- url: /(.+\.(ico|jpg|png|gif))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(ico|jpg|png|gif))$
login: admin
secure: always
- url: /#/(.+\.(htm|html|css|js|json|map|ttf|dart))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(htm|html|css|js|json|map|ttf|dart))$
login: admin
secure: always
- url: /(.+\.(htm|html|css|js|json|map|ttf|dart))$
static_files: Admin/web/\1
upload: Admin/web/(.+\.(htm|html|css|js|json|map|ttf|dart))$
login: admin
secure: always
- url: /(.+\.php)$
static_files: Admin/\1
upload: Admin\/(.+\.php)$
login: admin
secure: always
- url: /(.*)$
static_files: Admin/web/index.html
upload: Admin/web/(.*)$
login: admin
secure: always
【问题讨论】:
你确定你的manifest.json
和FontManifest.json
在Admin/web/
里面吗?
另外,文档中有一个通知Static files cannot be the same as application code files.
cloud.google.com/appengine/docs/standard/php7/config/…
顺便说一句,您的 PHP 文件是否按预期工作?看起来它们不应该工作,因为静态文件不可执行。您应该通过entrypoint
提供服务
是的,它是Admin/web/manifest.json
和Admin/web/assets/FontManifest.json
。对于脚本处理程序,我没有看到将/.*
引用到/folder/.*
的方法。我不确定 php 是否正常工作。在测试时我使用了entrypoint: server Admin/front.php
,所以我只是根据您的建议添加了它。
我上一条评论中有错字。我添加了entrypoint: serve Admin/front.php
【参考方案1】:
编辑
原因显然是上传处理程序只需要保留扩展的捕获组。为什么会这样,我不知道。
所以,这是一个更正确的答案,虽然我错过了这背后的原因。
service: admin
runtime: php72
entrypoint: serve Admin/front.php
handlers:
- url: /(.+\.(ico|jpg|png|gif))$
static_files: Admin/web/\1
upload: Admin/web/.+\.(ico|jpg|png|gif)$
login: admin
secure: always
- url: /(.+\.(htm|html|css|js|json|map|ttf|dart))$
static_files: Admin/web/\1
upload: Admin/web/.+\.(htm|html|css|js|json|map|ttf|dart)$
login: admin
secure: always
- url: /
static_files: Admin/web/index.html
upload: Admin/web/index.html
login: admin
secure: always
--旧版本--
好的,所以秘诀是不要以$
结束 URL 模式。
这是工作页面:
service: admin
runtime: php72
entrypoint: serve Admin/front.php
handlers:
- url: /(.+\.(ico|jpg|png|gif))
static_files: Admin/web/\1
upload: Admin/web/(.+\.(ico|jpg|png|gif))
login: admin
secure: always
- url: /(.+\.(htm|html|css|js|json|map|ttf|dart))
static_files: Admin/web/\1
upload: Admin/web/(.+\.(htm|html|css|js|json|map|ttf|dart))
login: admin
secure: always
- url: /
static_files: Admin/web/index.html
upload: Admin/web/index.html
login: admin
secure: always
我使用entrypoint: serve Admin/front.php
来服务于 php。
【讨论】:
我想在你的模式中包含$
和扩展名会更好,以避免错误解析像 my.cool.mapper.php
这样的文件。也许不是最好的例子,但我希望你清楚为什么需要扩展模式
非常好。不幸的是,它不适用于$
,所以我没有太多选择。不过,很少有像manifest.json.php
这样的文件,所以它是可行的。
即使您只在 - url: /
附近留下删除 $
并将其保留在其他任何地方,它对您不起作用吗?
另外,看起来你可以结合你的第一个和第二个处理程序
好的,所以我重新检查了 app.yaml 引用,发现url:
和upload:
之间的括号使用有所不同。如果你能提供一个答案,可能包括你的最后一个建议,并解释为什么括号不同,我可以给你赏金(在 8 小时内到期)。另外,是的,仅在 - url: /
附近删除 $
也有效。以上是关于如何正确格式化 app.yaml 以使用 PHP 后端托管 Flutter Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
PHP Google App Engine YAML 找不到目录
将参数传递给 app.yaml Google App Engine 中的 php