Как сопоставить общие запросы каталогов с соответствующим файлом index.html в Google AppEngine?

У меня есть статический сайт в App Engine, использующий файл app.yaml по умолчанию. Основной обработчик url ​​выглядит так:

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

Я хочу направлять все запросы форм:

http://mysite/somedirectory и http://mysite/somedirectory/

to http://mysite/somedirectory/index.html

Как это сделать?


person Adam Wildavsky    schedule 31.10.2018    source источник


Ответы (2)


Для шаблона URL http://mysite/somedirectory/ у вас может быть такой обработчик:

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

Конечно, этот обработчик должен быть вставлен перед универсальным обработчиком, который у вас уже есть.

Но с шаблоном URL http://mysite/somedirectory все сложно, поскольку вы не можете определить, представляет ли somedirectory файл и должен ли он обслуживаться как есть, или каталог, и в этом случае должен обслуживаться соответствующий index.html.

Если вы не следуете строгому правилу, которое можно использовать для различения файлов от каталогов. Например, если вы знаете, что все ваши файлы имеют . в своих именах и расширение имени файла после него, а все каталоги не имеют . в своих именах, тогда вы можете использовать пара таких обработчиков:

# a "." in name means a file, serve as-is:
- url: /(.*\/[^\/]*\.[^\/]*)$
  static_files: www/\1
  upload: www/.*

# no "." in name means a directory, serve corresponding index.html:
- url: /((.*))$
  static_files: www/\1/index.html
  upload: www/.*/index.html

Поскольку эта пара сама становится универсальным фильтром, она должна быть помещена последней (все остальные обработчики, которые могут быть у вас, должны быть помещены перед ней), заменяя имеющийся у вас универсальный обработчик.

person Dan Cornilescu    schedule 31.10.2018
comment
Спасибо, Дэн! Я попробую и доложу. - person Adam Wildavsky; 31.10.2018
comment
Ответ Дэна направил меня на верный путь. Я поставлю то, что у меня получилось, как новый ответ - StackExchange считает, что это слишком долго для комментария. - person Adam Wildavsky; 31.10.2018

Ответ Дэна направил меня на верный путь. Он работал для всего, кроме корневого каталога. Вот что я в итоге использовал:

# Ending with a "." followed by non-slashes means a file, serve as-is:
- url: /((.*\.[^\/]+))$
  static_files: www/\1
  upload: www/.*

# Ending in a slash means a directory, serve corresponding index.html:
- url: /((.*))/$
  static_files: www/\1/index.html
  upload: www/.*/index.html

# Did not match above so must be a directory, serve corresponding index.html:
- url: /((.*))$
  static_files: www/\1/index.html
  upload: www/.*/index.html

Вы можете увидеть сайт в действии по адресу https://www.tameware.com.

person Adam Wildavsky    schedule 31.10.2018
comment
Дох! Это работает не во всех случаях - перед публикацией я не тестировал должным образом. Я буду работать над исправлением. - person Adam Wildavsky; 31.10.2018
comment
Исправлено и отредактировано. Я использовал одинарные скобки вместо двойных пар в одном из регулярных выражений. - person Adam Wildavsky; 31.10.2018
comment
Проблема все еще есть. Все три из них откроют одну и ту же страницу, как я и хотел: mysite / somedirectory mysite / somedirectory mysite / somedirectory.index. html Но если я перейду с помощью первой ссылки, то щелчок для доступа к ссылкам непосредственно в этом каталоге не будет работать, что даст 404. Доступ к каталогам в каталоге действительно работает - любопытно! - person Adam Wildavsky; 02.11.2018
comment
Если я перейду на страницу, используя первую ссылку, тогда, когда я попытаюсь щелкнуть ссылку для файла в этом каталоге, сервер будет искать его в корневом каталоге сайта, то есть в mysite / вместо mysite / somedirectory / - person Adam Wildavsky; 02.11.2018