正确的html网站的Google App Engine正确的app.yaml处理程序配置

时间:2019-02-10 13:12:11

标签: google-app-engine web-hosting hugo static-site app.yaml

这是我网站的文件结构:

public
│   404.html
│   app.yaml
│   index.html
│   index.xml
│   prereqs.zip
│   sitemap.xml
│   sof2018.py
|
├───categories
│       index.html
│       index.xml
├───css
│       styles.css
├───home
│       index.html
├───js
│       scripts.js
├───prerequisites
│       index.html
├───scripts
│   │   index.html
│   │   index.xml
│   │
│   ├───page
│   │   └───1
│   │           index.html
│   │
│   └───sof2018
│           index.html
├───tags
│       index.html
│       index.xml
└───usage
        index.html

基本上,我需要确保以下内容:

  • 如果以斜杠结尾的任何文件夹(例如/scripts/page/1//home/)被调用,则应在该文件夹中查找index.html
  • 如果在调用任何文件夹时不加斜杠(例如/scripts/page/1/home),则应在该文件夹中查找index.html
  • 如果调用了任何文件(例如/css/styles.css/prereqs.zip),它将返回该文件

区分文件和文件夹的方法可能是简单地检查是否存在句点(。),因为我的所有文件都具有扩展名。虽然我猜想其他人也可以从处理无扩展名文件的解决方案中受益。

我尝试了许多不同的正则表达式,它们似乎都遗漏了某些情况。还几乎在同一件事上尝试了先前关于stackoverflow的问题中提出的所有解决方案。

我不是在寻找适合我的网站的app.yaml,可以通过手动处理每个文件夹,案例等来实现。

我正在寻找一种通用解决方案,该解决方案将与传统网络托管服务商的工作方式完全一样,因为我想这也会使其他人受益。然后,我可以自由添加/更改内容/结构,而不必每次都更新app.yaml。

P.S。老实说,谷歌应该自己提供解决方案,但事实并非如此。我猜想即使是合适的Web开发人员也不是正则表达式大师。

P.S.2该网站是使用Hugo静态网站生成器创建的。我可以确认它可以在传统的网络主机(GoDaddy)上运行。我也不知道足够的html / css / js来确定该网站的实际内部工作是什么;如果需要,我可以提供源文件。

1 个答案:

答案 0 :(得分:2)

您无法使用完全静态的网站在(标准环境)GAE上实现所有这些功能。那是因为您无法提前告知/some/path/item是文件还是文件夹(例如,在创建app.yaml配置时),因此应分别返回/some/path/item/some/path/item/index.html

写正确的正则表达式不是问题,而是要为相同正则表达式有2个不同结果。

要实现所需的功能,您需要该应用在运行时检查条件并做出决定-不再是静态网站。

如果您放下第二颗子弹,您可以通过以下方法实现其余目标:

- url: /(.*)/
  static_files: public/\1/index.html
  upload: public/.*/index.html

- url: /(.*)$
  static_files: public/\1
  upload: public/.*

如果您可以从文件夹中区分文件,则可以提出一个方案。例如,通过指定所有文件名都必须具有扩展名(目录名称中不能包含.),您可以执行以下操作:

# /optional/path/folder/ - serve index.html inside
- url: /(.*)/
  static_files: public/\1/index.html
  upload: public/.*/index.html     

# /optional/path/name.extension => files - serve them
- url: /((.*\/)*[^\/]+\.[^\/]+)$
  static_files: public/\1
  upload: public/.*

# anything else is a folder - serve index.html inside
- url: /(.*)$
  static_files: public/\1/index.html
  upload: public/.*/index.html