原始问题
应用引擎 SDK 1.6.5
Python 2.7
网络应用2
我已经实现了 webapp2 方案来保护页面到 https。问题是,当用户说 http://site/login 而不是 https://site/login 时,由于方案无法识别路由,他们会收到 404 错误。
例子main.py
# Libraries
import webapp2
# Local Controllers
from controllers.HomeHandler import HomeHandler
from controllers.LoginHandler import LoginHandler
app = webapp2.WSGIApplication([
webapp2.Route(r'/', HomeHandler),
webapp2.Route(r'/login', LoginHandler, schemes=['https'], name='login')
], debug=True)
我在 https 路由下面添加了另一个路由/ Controller 来捕获 http 请求:
webapp2.Route(r'/login', RouteLogin)
路由登录.py
# Libraries
import webapp2
class RouteLogin(webapp2.RequestHandler):
def get(self):
self.redirect('https://site.appspot.com/login')
这行得通,但似乎应该有更好的方法来做到这一点。就像在 Apache Web 服务器上使用 htaccess 一样。这太像我喜欢的 hack 了。我真的不喜欢我的代码中的硬编码 URL。更不用说 2 个登录请求没什么大不了的,但可能还有其他示例最终导致成本过高。
注意 1:如果您正在查看此解决方案,请注意使用 HTTPS 方案还意味着如果不删除 SCHEME 或配置为开发设置的变量,您将无法使用开发控制台。
注意 2:我能够以编程方式提供 HTTPS 而不是 HTTP。我在下面的评论中走在了正确的轨道上,但它需要一个论点。
webapp2.uri_for('login', _scheme='https')
这会给你正确的 https://someapp.appspot.com/login网址。不幸的是,它没有解决我的主要问题,即如何处理人们在没有 https 的情况下将 url 输入地址栏并收到错误,除非我使用上面的 hack。所以我还在寻找 WSGI 的方式来将收入请求路由到 HTPPS。
编辑:添加注释 1 并澄清标题,我认为很明显我使用的是源代码中的 WSGI 而不是 CGI。
最佳答案
在 app.yaml 中设置 URL,而不是在代码中。参见 https://developers.google.com/appengine/docs/python/config/appconfig#Secure_URLs
例如:
handlers:
- url: /foo/.*
script: accounts.py
secure: always
这会将 HTTP 重定向到 HTTPS。
关于python - 如何使用 WSGI 将用户从 http 重新路由到 https,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10804873/