如何正确格式化 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.jsonFontManifest.jsonAdmin/web/里面吗? 另外,文档中有一个通知Static files cannot be the same as application code files.cloud.google.com/appengine/docs/standard/php7/config/… 顺便说一句,您的 PHP 文件是否按预期工作?看起来它们不应该工作,因为静态文件不可执行。您应该通过entrypoint 提供服务 是的,它是Admin/web/manifest.jsonAdmin/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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Notepad++开发PHP如何设置正确的UTF-8编码

PHP Google App Engine YAML 找不到目录

将参数传递给 app.yaml Google App Engine 中的 php

Google Cloud App Engine app.yaml php72 路由问题

如何正确缩进 PHP/HTML 混合代码? [关闭]

如何使用 app.yaml 在 GAE(python) 中上传静态文件?