Есть несколько недорогих способов размещения статического веб-сайта, созданного с помощью генератора статических сайтов, такого как Jekyll, Hugo или Pelican: Весь этот блог статически сгенерирован с помощью Jekyll. Однако я не могу использовать ни один из перечисленных выше вариантов, потому что за время существования этого блога я изменил доменные имена, изменил схемы URL-адресов и переименовал сообщения, и я хочу сохранить все старые URL-адреса Я размещал этот блог с помощью Apache, а в последнее время и nginx на одной виртуальной машине, и функции перенаправления любой части программного обеспечения работают просто отлично, но я был готов разместить его где-нибудь в новом и другом месте. В предыдущем посте описывалось, как я перенаправляю URL-адреса из старого домена в новый домен с помощью Google App Engine и Python, но теперь мне нужен был способ обслуживания статического контента. **и** URL-адреса перенаправления из одного и того же домена. Это же требование перенаправления домена является причиной того, что я не могу просто использовать функцию только статического контента Google App Engine (ссылка в списке выше). Однако я могу использовать Google App Engine в сочетании с простым приложением Golang, чтобы обслуживать как статический контент **, так и ** перенаправления одного и того же домена. ## Почему Google App Engine? Прежде чем вы углубитесь в остальную часть поста, возможно, вам интересно, зачем размещать блог на Google App Engine? Вот мои причины, почему: - Если ваш трафик соответствует уровню бесплатного пользования App Engine, составляющему 28 часов инстансов и 1 ГБ исходящего трафика в день, размещение блога практически бесплатно. - Отправка обновлений выполняется одной командой - Ведение журнала и мониторинг интегрированы с помощью Stackdriver - Автоматическое масштабирование вверх и вниз на основе шаблонов трафика - С помощью нескольких щелчков мыши веб-журналы могут быть легко переданы во что-то вроде BigQuery для долгосрочного хранения и специального анализа. - Управляемые SSL-сертификаты с использованием LetâÃÂÃÂs Encrypt ## Предпосылки Этот пост предполагает следующее: - Вы знакомы с Google Cloud Platform (GCP) и уже создали проект GCP. - Вы установили Google Cloud SDK. - Вы подтвердили подлинность gcloudcommand против вашей учетной записи Google Создать проект GCP Если вы еще не создали **GCP Project выполните следующие действия: - Откройте веб-браузер и создайте учетную запись Google или войдите в нее. - Перейдите к консоли GCP. — если это ваш первый проект GCP, вам будет предложено создать проект GCP. Каждая учетная запись Google получает кредит в размере 300 долларов США, который можно использовать в течение 12 месяцев для оплаты GCP. Вам необходимо ввести кредитную карту для создания проекта GCP, но она не будет списана до тех пор, пока кредит в размере 300 долларов США не будет израсходован или истечет 12 месяцев. - Если это новый проект GCP, вам нужно будет включить API Compute Engine, перейдя в раздел Compute Engine консоли GCP, и дождаться завершения инициализации. Установите Google Cloud SDK Если вы еще не установили **Google Cloud SDK следуйте инструкциям здесь. Аутентифицировать gcloud После того, как вы создали проект GCP и установили Google Cloud SDK, последним шагом будет аутентификация gcloud в свой аккаунт Google. Откройте приложение терминала и выполните следующую команду: авторизация gcloud Веб-страница откроется в вашем веб-браузере. Выберите свою учетную запись Google и дайте ей разрешение на доступ к GCP. После завершения вы будете аутентифицированы и готовы двигаться дальше. ## Создать каталог Затем создайте каталог где-нибудь на своей рабочей станции для хранения вашего приложения Google App Engine: mkdir ~/Сайты/example.com/app_engine Перейдите в этот каталог: компакт-диск ~/Сайты/example.com/app_engine В оставшейся части этого поста предполагается, что вы работаете внутри этого каталога. Кроме того, создайте каталог внутри Каталог **app_engine** называется **static mkdir ~/Сайты/example.com/app_engine/static Вы вернетесь к этому каталогу позже ## Создать app.yaml Google App Engine обычно требует два файла: **app.yaml** и **файл приложения**, написанный на Python, Golang, Java или PHP — в данном случае это будет Golang. **app.yaml** предоставляет необходимую конфигурацию для запуска вашего приложения. В **app.yaml может существовать множество различных параметров. Эти параметры могут различаться в зависимости от используемого языка программирования. Для этого поста будет использоваться Golang, и вы можете найти все доступные параметры Golang здесь Создать файл **app.yaml** со следующим содержимым: время выполнения: go api_version: go1 обработчики: - url:script: _go_app secure: всегда redirect_http_response_code: 301 Заметить, что **безопасный: всегда** был установлен. Это означает, что приложение Golang всегда будет обслуживаться через HTTPS. Если конечный пользователь переходит к веб-приложению через HTTP, он по умолчанию будет перенаправлен 302 на версию HTTPS. Вот почему также был установлен **redirect_http_response_code: 301**. Я всегда хочу, чтобы веб-приложение обслуживалось через HTTPS, и я не хочу, чтобы поисковые системы интерпретировали перенаправление с HTTP на HTTPS как временное перенаправление; это постоянный редирект Если у вас есть статические ресурсы (а, вероятно, они у вас есть), рекомендуется сообщить об этом App Engine и позволить ему обслуживать эти ресурсы из хранилища объектов, а не из вашего приложения. Сделать это легко, и это также делается через **app.yaml** файл Например, если у вас есть файл favicon, каталог CSS, каталог Javascript и каталог изображений, используйте следующее: **app.yaml** файл: среда выполнения: go api_version: go1 обработчики: - url: /favicon.png$ static_files: static/favicon.png загрузка: static/favicon.png - url: /css static_dir: static/css - url: /js static_dir: static/js - url: /images static_dir: static/images - url:script: _go_app secure: всегда redirect_http_response_code: 301 ## Создать main.go Далее вам понадобится файл приложения Golang Чтобы следующий код соответствовал вашим потребностям, создайте файл **main.go скопируйте и вставьте приведенный ниже код и внесите следующие изменения: - В domainvariable, измените значение, чтобы оно соответствовало вашему доменному имени с правильным протоколом HTTP. - В urlsmap, замените все пары ключ-значение, чтобы они соответствовали перенаправлениям, которые вам нужны. Замените каждый ключ только частью пути (/example-post-1.htmlвместо httpsexample.com/example-post-1.html) старого URL-адреса текущего домена, который вы хотите держать в живых. Затем замените каждое значение частью пути нового URL-адреса текущего домена, на который вы хотите перенаправить Все редиректы будут 301 редиректами. Это можно изменить, изменив **301** в приведенном ниже коде на другой код состояния перенаправления HTTP, например **302** package main import ( "net/http""os""strings") func init() { http.HandleFunc handler) } func handler(w http.ResponseWriter, r *http.Request) { // True (ok), если запрос путь находится на карте URL-адресов, если значение, ok := urls[r.URL.Path]; ok { value = domain + value http.Redirect(w, r, value, 301) } else { path := "static/"+ r.URL.Path // Возвращаем 403, если HTTP-запрос относится к существующему каталогу не содержать файл index.html, если f, err := os.Stat(path); err == nil&& f.IsDir() { index := strings.TrimSuffix(path,+ "/index.html"if _, err := os.Open(index); err != nil { w.WriteHeader (403) w.Writebytehtml>