Пользовательская страница 404 Google App Engine для статических файлов

Я работаю над приложением GAE, которое в основном состоит из статического контента. Я настроил следующие обработчики:

- url: /content/(.*\..*)
  static_files: static/content/\1
  upload: static/content/(.*)

- url: /content/(.+)
  static_files: static/content/\1.html
  upload: static/content/(.*)\.html

Первый обработчик используется для обслуживания изображений, таблиц стилей и т. Д .; второй обрабатывает простые URL-адреса, такие как /content/zoo/monkeys/george, и обслуживает соответствующий HTML-файл.

Прямо сейчас GAE возвращает пустую страницу, если для URL-адреса нет соответствующего статического файла. Я хотел бы настроить для этих случаев специальную страницу 404, но, видимо, это непросто.

В ответах на аналогичные вопросы предлагалось разместить в нижней части моего app.yaml универсальный обработчик с RequestHandler, который генерирует страницу с ошибкой. Однако /content/(.+) соответствует всем URL-адресам в /content/, действительным или недействительным, что означает, что такой обработчик не будет вызван.

Я могу думать только о двух других решениях:

  1. Направляйте все запросы через динамический обработчик, который записывает контент для действительных URL-адресов или страницу ошибок для недопустимых. Мне это не нравится, потому что это гораздо менее эффективно, чем позволить GAE обслуживать статические файлы.
  2. Объявите отдельный статический обработчик, который явно соответствует каждому статическому файлу, а затем поместите обработчик "улова всех" внизу - мне это тоже не нравится, потому что это приведет к длинному списку обработчиков.

Есть ли другой способ настроить правильную страницу 404 для этого случая?


person Tony the Pony    schedule 06.05.2016    source источник
comment
Я думаю, ты загнал себя в угол. Appengine не рассчитан на этот вариант использования.   -  person Tim Hoffman    schedule 07.05.2016


Ответы (2)


Ответьте на старую ветку для тех, кто сочтет это полезным.

  1. Добавьте require_matching_file: true в качестве последнего свойства обработчика.

    Если соответствующего файла нет, будет вызван следующий обработчик в водопаде вместо создания страницы по умолчанию 404.

  2. Затем добавьте новый общий раздел в нижней части app.yaml с динамическим обработчиком, который обрабатывает недопустимые URL-адреса.

Пример:

- url: /content/(.*\..*)
  static_files: static/content/\1
  upload: static/content/(.*)
  require_matching_file: true

- url: /content/(.+)
  static_files: static/content/\1.html
  upload: static/content/(.*)\.html
  require_matching_file: true

- url: /.*
  script: auto

Таким образом, GAE будет обслуживать все существующие статические активы через первые 2 обработчика. Динамический обработчик будет вызываться только для несуществующих URL-адресов. Очевидно, вам нужно будет написать код для этого ...

Один большой отказ от ответственности: require_matching_file недокументирован. Но оказывается, что GAE автоматически добавляет это поле в ваш app.yaml, когда вы его загружаете.

person Vejja    schedule 08.10.2018
comment
Не знаю, как вы узнали об этом, но спасибо! - person Corentin S.; 31.12.2019
comment
Безуспешно - я предполагаю, что require_matching_file больше не используется, или это работает только с static_files, но не static_dir. - person user2752467; 29.03.2021

Попробуйте error_handlers.

error_handlers:
 - file: custom_404.html

Из документации GAE App.yaml - каждая запись файла указывает на статический файл, который следует обслуживать вместо общего ответа об ошибке. Если вы укажете элемент файла без соответствующего элемента error_code, статический файл будет страницей ошибок по умолчанию для вашего приложения.

person N.P    schedule 27.06.2016