google-app-engine - 在 GAE 中使用自定义域规范化静态站点的 URL

标签 google-app-engine redirect google-cloud-platform web2py canonicalization

我在 GAE 上运行一个静态站点,并使用启用了 SSL 证书的自定义域(我们称之为 example.com)。我想将 URL 规范化为 https://www.example.com/。这意味着捕获对 myproject.appspot.com、纯 HTTP 和/或裸域的任何请求,并通过 HTTPS 重定向到 www

我知道不可能将重定向逻辑放入 app.yaml 中,但理想情况下我希望将静态文件服务逻辑保留在那里,并且只有用于重定向的应用程序代码。 (而不是在应用程序代码中进行静态服务。)

这是我到目前为止所拥有的:

文件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 仍然提供内容,而不是重定向到自定义域。

我看到了a similar SO question并将其用作我上面的代码的基础。我相当密切地关注它,所以我不确定它是否已经过时或缺少细节。

我对webapp2不太熟悉。也对不同框架甚至不同编程语言的解决方案持开放态度。

最佳答案

正如 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)

这允许完成所有重定向,同时仍然保持通过static_files路由静态站点的能力。处理程序。

顺便说一句,我也没有意识到简单地做 gcloud app deploy .从应用程序根目录仅部署默认服务。为了部署这整个事情,我必须运行 gcloud app deploy . dispatch.yaml canonicalizer .

关于google-app-engine - 在 GAE 中使用自定义域规范化静态站点的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59743875/

相关文章:

azure - 如何在 Azure AD 重定向 URI 中添加带参数的回复 URI?

ubuntu - GCP 计算 scp 错误 : You do not currently have an active account selected

google-app-engine - WebPageTest 提示即使我启用了缓存也没有缓存静态资源

java - 重定向 flash 属性不适用于 List<>

android - 如何在Android中重定向到我的Play商店应用列表

google-cloud-platform - 无需停机即可将实时域切换到 Google Cloud Run

google-cloud-platform - Multipolygon 无法在 Google BigQuery GIS 中上传

node.js - 使用 Node.js 将大量文件上传到 Google Storage 存储桶

python - Google Apps 中的 Cron 作业是否有时间限制?

java - 使用 Eclipse 的 GAE 中的 NoClassDefFoundError