Правильная конфигурация обработчиков app.yaml для Google App Engine для статического html-сайта

Вот файловая структура моего сайта:

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. Честно говоря, Google должен был предоставить решение, но они этого не сделали. Я предполагаю, что даже настоящие веб-разработчики не являются мастерами регулярных выражений.

P.S.2 Сайт сделан с помощью генератора статических сайтов Hugo. Я могу подтвердить, что он работает на традиционном веб-хостинге (GoDaddy). Также я недостаточно знаю html/css/js, чтобы точно сказать, какова фактическая внутренняя работа сайта; при необходимости могу предоставить исходники.


2
837
1

Ответ:

Решено

Вы не можете добиться всего этого в (стандартной среде) GAE с полностью статическим веб-сайтом. Это потому, что у вас нет возможности сказать заранее (т. е. при создании конфигурации app.yaml), является ли /some/path/item файлом или папкой, и, следовательно, /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