Настройте файл yaml Google App Engine для обработки ошибки 404 - PullRequest
0 голосов
/ 26 декабря 2018

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

Пример: при обновлении https://my-app ... appspot.com/create-ad throw 404 not found

Я пробовал Angular 6 маршрутов не найдены в Google App Engine и Как настроить GoogleФайл yaml App Engine для обработки ошибки 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-адресов в индекс.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 при обновлении страницы

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

Ответы [ 2 ]

0 голосов
/ 29 мая 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
0 голосов
/ 03 января 2019

Причина кода ошибки 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 endpoint.

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

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

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

...