Настройте yaml-файл Google App Engine для обработки ошибки 404

После развертывания моего приложения на Google App Engine все работает как шарм, я могу получить доступ ко всем страницам, но когда я обновляюсь, я получаю ошибку 404

Пример: при обновлении https://my-app...appspot.com/create-ad бросить 404 не найдено

Я пробовал маршруты Angular 6, которых нет в Google App Engine и Как настроить Google App Engine yaml для обработки ошибки 404, но с тем же результатом

Это в моем app.yml

runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /
  static_files: dist/index.html
  upload: dist/index.html
- url: /
  static_dir: dist
- url: /.*
  static_files: dist/index.html
  upload: dist/index.html

skip_files:
- ^.*node_modules(/.*)?
- ^.*json_data(/.*)?
- ^.*e2e(/.*)?

а также попробовал эту конфигурацию app.yml для перенаправления всего URL-адреса на index.html

runtime: python27
api_version: 1
threadsafe: false
service: frontend-accept

handlers:
- url: /
  static_files: dist/index.html
  upload: dist/index.html

- url: /
  static_dir: dist

- url: /.*
  script: main.py

skip_files:
- ^.*node_modules(/.*)?
- ^.*json_data(/.*)?
- ^.*e2e(/.*)?

это мой main.py

import webapp2
app = webapp2.WSGIApplication()

class RedirectToHome(webapp2.RequestHandler):
    def get(self, path):
        self.redirect('/dist/index.html')


routes = [
    RedirectRoute('/<path:.*>', RedirectToHome),
]

for r in routes:
    app.router.add(r)

Но всегда получаю 404 при обновлении страницы

Любая помощь? Спасибо


person AhmeX2    schedule 25.12.2018    source источник


Ответы (2)


Причина кода ошибки 404 HTTP связана с этими обработчиками:

- url: 
  static_dir: dist

Как указано в официальной документации Google App Engine, использование static_dir: dist приводит к тому, что все URL-адреса, начинающиеся с шаблона /, обрабатываются как пути к статическим файлам в каталоге /dist, поэтому, например, каждый раз, когда вы вызываете URL-адрес /whatever, приложение будет искать файл /dist/whatever, поскольку он не существует, вы получаете ошибка 404.

Я считаю, что следующий код будет работать так, как вы ожидаете:

runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /
  static_files: dist/index.html
  upload: dist/index.html

- url: /dist/index.html
  static_files: dist/index.html
  upload: dist/index.html

- url: /.*
  script: main.app


skip_files:
- ^.*node_modules(/.*)?
- ^.*json_data(/.*)?
- ^.*e2e(/.*)?

Обработчик конечной точки / будет обслуживать файл dist/index.html, а также конечную точку /dist/index.html.

Обработчики проверяются последовательно, и если ни один из вышеперечисленных обработчиков не был вызван, то любой URL-адрес, соответствующий шаблону /.* (а это все они), вызовет сценарий main.app (это в основном переопределит сообщение об ошибке 404).

Этот сценарий перенаправляет вас к конечной точке /dist/index.html, поэтому это причина, по которой его нужно обрабатывать в файле yaml.

В заключение мне пришлось импортировать webapp2_extras.routes, чтобы использовать RedirectRoute в main.py.

person llompalles    schedule 03.01.2019
comment
Я добавил жирный шрифт import webapp2 from webapp2_extras в файл main.py и установил app.yml на то, что вы мне посоветовали, но получил Не удалось загрузить ресурс: сервер ответил статусом 500 () - person AhmeX2; 05.01.2019
comment
@ AhmeX2, правильный оператор импорта - from webapp2_extras.routes import RedirectRoute - person llompalles; 07.01.2019

наконец, решение состояло в том, чтобы правильно настроить app.yml

runtime: python27
api_version: 1
threadsafe: true
skip_files:
- ^(?!dist)  # Skip any files not in the dist folder

handlers:
- url: /((?:runtime|main|polyfills|styles|vendor)\.[a-z0-9]+\.js)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/\1
  upload: dist/browser/.*

- url: /((?:runtime|main|polyfills|styles|vendor)\.[a-z0-9]+\.js\.map)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/\1
  upload: dist/browser/.*

- url: /(styles\.[a-z0-9]+\.css)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/\1
  upload: dist/browser/.*

- url: /((?:assets|docs)/.*|favicon\.ico)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/\1
  upload: dist/browser/.*

- url: /(manifest\.json|ngsw\.json|ngsw-worker\.js|safety-worker\.js|worker-basic\.min\.js|ngsw_worker\.es6\.js\.map)
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/\1
  upload: dist/browser/.*

- url: /(.*\.woff)
  mime_type: application/x-font-woff
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/\1
  upload: dist/browser/.*

- url: /.*
  secure: always
  redirect_http_response_code: 301
  static_files: dist/browser/index.html
  upload: dist/browser/index\.html
  http_headers:
    Strict-Transport-Security: max-age=31536000; includeSubDomains
    X-Frame-Options: DENY
person AhmeX2    schedule 29.05.2019