如何确定我的mod_wsgi应用程序是否在HTTPS上运行?
我刚刚继承了一个在Apache 2.4,mod_wsgi 3.4和Python 2.7下运行的Python应用程序。同一个应用程序同时处理HTTP和HTTPS请求。如何确定我的mod_wsgi应用程序是否在HTTPS上运行?
在现有的代码,它试图确定reqeust是HTTPS通过检查环境:
if context.environ.get('HTTPS') not in ['on', '1']:
此检查失败,即使连接实际上是HTTPS。在查看显示环境变量的扩展回溯时,我看到HTTPS
实际上不在Apache传递的环境中。
所以我的问题是:
- 这是一个Apache的配置问题?
- 此检查是否完全错误,应该重写以检查其他内容?如果是这样,什么?
- 或者我应该放弃并用nginx替换Apache,就像我真正想做的一样?
Apache的mod_ssl
可配置设置HTTPS
环境变量,但doesn't do so by default性能方面的原因。
你可以明确地启用它,但由于您使用的是WSGI应用程序,它可能是一个更好的主意来检查wsgi.url_scheme
环境变量,而不是; WSGI规范保证它的存在,如果你最终转向nginx,它不会需要对你的应用程序做任何进一步的修改。
有趣。我已经设置了'SSLOptions + StdEnvVars'。并且列出的所有变量_except_“HTTPS”都被传递。无论如何,我喜欢便携式的东西,所以这看起来就像我要去的方式。 – 2013-02-24 08:13:12
在最近的mod_wsgi版本中,它会故意从WSGI environ字典中删除HTTPS,因为人们依赖它,这意味着它们不会编写可移植的WSGI代码。您应该使用wsgi.url_scheme作为此答案的标准和保证方式,这将适用于WSGI。 – 2013-02-24 10:14:35
@GrahamDumpleton是的,我刚刚在[mod_wsgi 3.4更新日志](https://code.google.com/p/modwsgi/wiki/ChangesInVersion0304)中阅读了相关内容。 – 2013-02-24 23:39:30
当使用CGI,WSGI或SSI时,您需要建议Apache发送HTTPS
标头,否则它将为空。您可以在配置或的.htaccess做到这一点
<IfModule mod_env.c>
SetEnv HTTPS on
</IfModule>
奇怪。我把它放在SSL虚拟主机中,并且它没有被传递。 – 2013-02-24 08:16:24
今天笔者了解到(https://code.google.com/p/modwsgi/wiki/ChangesInVersion0304)条的mod_wsgi的HTTPS环境变量[3.4版本开始]并在mod_wsgi的应用程序依赖于它是不推荐使用。 – 2013-02-24 23:38:38
那么,凯恩纳尔恩的答案就更好了。 – sjdaws 2013-02-24 23:58:58
你肯定Python是[编译支持SSL(http://morlockhq.blogspot.com.au/2008/05/python-tip-checking-to-see-if-your.html)? – sjdaws 2013-02-24 07:37:25
@sjdaws'hasattr(socket,“ssl”)'为我返回'True'。 – 2013-02-24 07:38:25
不Apache代理传球总是通过'http:// backend'而不是代理通过SSL连接到'的https:// backend' – sjdaws 2013-02-24 07:38:57