Канонизируйте URL для сайта stati c с пользовательским доменом в GAE - PullRequest
2 голосов
/ 15 января 2020

Я использую сайт stati c в GAE и использую собственный домен (назовем его example.com) с включенными сертификатами SSL. Я хотел бы канонизировать URL-адреса до https://www.example.com/. Это означает перехват любых запросов к myproject.appspot.com, обычному HTTP и / или свободному домену и перенаправление на www через HTTPS.

Я понимаю, что невозможно поместить логи перенаправления c в app.yaml, но в идеале я бы хотел сохранить файл stati c, обслуживающий логи c, и иметь только код приложения для перенаправления. (В отличие от выполнения операции stati c в коде приложения.)

Вот что у меня есть:

Содержимое файла app.yaml:

runtime: python27
api_version: 1
threadsafe: true

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

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

Содержимое файла dispatch.yaml:

dispatch:
- url: "myproject.appspot.com/*"
  module: canonicalizer

Содержимое файла canonicalizer.yaml:

module: canonicalizer
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: canonicalizer.app

Содержимое файла canonicalizer.py:

import webapp2

def get_redirect_uri(handler, *args, **kwargs):
    return 'https://www.example.com/' + kwargs.get('path')

app = webapp2.WSGIApplication([
    webapp2.Route('/<path:.*>',
    webapp2.RedirectHandler,
    defaults={'_uri': get_redirect_uri, '_code': 302}),
], debug=True)

Как видите, я только пытался реализовать перенаправление myproject.appspot.com. Я не смог заставить его работать; myproject.appspot.com по-прежнему обслуживает контент, а не перенаправляет его в пользовательский домен.

Я видел аналогичный вопрос SO и использовал его в качестве основы для моего кода выше. Я внимательно следил за этим, поэтому не уверен, устарели ли они или отсутствуют детали.

Я не очень знаком с webapp2. Также открыты для решений в другой среде или даже на другом языке программирования.

Ответы [ 2 ]

4 голосов
/ 17 января 2020

Как сказал в своем ответе sllopis, перенаправление HTTP на HTTPS может быть реализовано через элемент secure: always.

Остальное, что я хотел сделать, нужно было сделать в коде приложения. Код в моем ответе был на правильном пути, но у меня была некоторая путаница по поводу того, как службы работают в GAE, и по поводу dispatch.yaml. Вот мой окончательный код:

<application root>/app.yaml

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /
  static_files: www/index.html
  upload: www/index.html
  secure: always
  redirect_http_response_code: 301

- url: /(.*)
  static_files: www/\1
  upload: www/(.*)
  secure: always
  redirect_http_response_code: 301

<application root>/dispatch.yaml

dispatch:
- url: "*.appspot.com/*"
  service: canonicalizer

- url: "example.com/*"
  service: canonicalizer

<application root>/canonicalizer/app.yaml

service: canonicalizer
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  script: canonicalizer.app

<application root>/canonicalizer/canonicalizer.py

import webapp2

def get_redirect_uri(handler, *args, **kwargs):
    return 'https://www.justinforcentral.com/' + kwargs.get('path')

app = webapp2.WSGIApplication([
    webapp2.Route('/<path:.*>',
    webapp2.RedirectHandler,
    defaults={'_uri': get_redirect_uri, '_code': 301}),
], debug=False)

Это позволяет выполнять все перенаправления, сохраняя при этом возможность маршрутизации сайта stati c с помощью обработчиков static_files.

Кроме того, я также не делал Не понимаю, что простое выполнение gcloud app deploy . из приложения root только развертывает службу по умолчанию. Чтобы развернуть все это, я должен был запустить gcloud app deploy . dispatch.yaml canonicalizer.

1 голос
/ 15 января 2020

Отображение пользовательских доменов в GAE

App Engine позволяет обслуживать приложения через пользовательский домен , например example.com вместо адреса по умолчанию appspot.com. Вы можете создать сопоставление домена для своего приложения App Engine , чтобы оно использовало собственный домен.

Вам потребуется выполнить следующее:

  1. Убедитесь, что вы являетесь владельцем своего домена через Central для веб-мастеров
  2. Убедитесь, что ваш домен подтвержден.
  3. При необходимости делегируйте право собственности на ваш домен другим пользователям или учетным записям служб.
  4. Сопоставьте свой домен с приложением App Engine.
  5. Заполните форму с перечисленными записями ресурсов, включая их тип и каноническое имя (CNAME).
  6. Добавьте эту информацию в конфигурацию DNS вашего регистратора домена.

Защита пользовательских доменов с помощью SSL

По умолчанию при сопоставлении пользовательского домена с приложением App Engine выдает управляемый сертификат для SSL для соединений HTTPS. Защита ваших пользовательских доменов с помощью SSL предлагает больше информации об этом.


Обработка запросов URL, которые не используют HTTPS

Любой обработчик URL может использовать настройку secure, включая обработчики сценариев и обработчики файлов stati c. Если для secure установлено значение always, запросы на URL , соответствующие этому обработчику, не использующему HTTPS , автоматически перенаправляются на HTTPS URL с тем же путем . Параметры запроса сохраняются для перенаправления.

Пример в файле app.yaml:

handlers:
- url: /youraccount/.*
  secure: always
  script: auto

Заключение

В результате после следующих действий Эти шаги, вы должны иметь собственный домен, правильно сопоставленный с вашим сайтом App Engine, который использует SSL-сертификаты для защиты пользовательского домена.

Более того, добавив обработчик secure:always в ваш файл app.yaml, все запросы URL, направленные к вашему сайту App Engine, будут автоматически перенаправлены на URL HTTPS с тем же путем.


Обновление - перенаправить все URL-адреса с помощью Google App Engine

Кредиты на Как перенаправить все URL-адреса с помощью Google App Engine :

app.yaml

handlers:
- url: /.*
  script: main.py

main.py

import webapp2

class MainPage(webapp2.RequestHandler):
    def get(self):
        self.redirect("https://example.com", True)

app = webapp2.WSGIApplication([
    ('/', MainPage),
], debug=True)

Затем вы можете настроить этот код в соответствии со своими потребностями.

...