我正在GAE上运行静态站点,并使用启用了SSL证书的自定义域。我想将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不太熟悉。也欢迎使用不同框架甚至不同编程语言的解决方案。
[App Engine允许应用程序通过自定义域提供服务,例如
example.com
,而不是默认的appspot.com
地址。您可以创建一个domain mapping for your App Engine app,以便它使用自定义域。
您将需要执行以下操作:
(CNAME)
。默认情况下,当您将自定义域映射到您的应用时,App Engine会为HTTPS连接的SSL颁发托管证书。 Securing your custom domains with SSL提供有关此的更多信息。
任何URL处理程序都可以使用
secure
设置,包括脚本处理程序和静态文件处理程序。如果secure
设置为always
,则与不使用HTTPS的此处理程序匹配的URL的请求
app.yaml
文件中的示例:
handlers: - url: /youraccount/.* secure: always script: auto
结论
因此,按照以下步骤操作后,您应该将自定义域正确映射到使用SSL证书保护自定义域的App Engine网站。
此外,通过在secure:always
文件中添加app.yaml
处理程序,针对您的App Engine网站的所有URL请求都将自动重定向到具有相同路径的HTTPS URL。