2013-02-24 35 views
0

我刚刚继承了一个在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,就像我真正想做的一样?
+0

你肯定Python是[编译支持SSL(http://morlockhq.blogspot.com.au/2008/05/python-tip-checking-to-see-if-your.html)? – sjdaws 2013-02-24 07:37:25

+0

@sjdaws'hasattr(socket,“ssl”)'为我返回'True'。 – 2013-02-24 07:38:25

+0

不Apache代理传球总是通过'http:// backend'而不是代理通过SSL连接到'的https:// backend' – sjdaws 2013-02-24 07:38:57

回答

3

Apache的mod_ssl可配置设置HTTPS环境变量,但doesn't do so by default性能方面的原因。

你可以明确地启用它,但由于您使用的是WSGI应用程序,它可能是一个更好的主意来检查wsgi.url_scheme环境变量,而不是; WSGI规范保证它的存在,如果你最终转向nginx,它不会需要对你的应用程序做任何进一步的修改。

+0

有趣。我已经设置了'SSLOptions + StdEnvVars'。并且列出的所有变量_except_“HTTPS”都被传递。无论如何,我喜欢便携式的东西,所以这看起来就像我要去的方式。 – 2013-02-24 08:13:12

+2

在最近的mod_wsgi版本中,它会故意从WSGI environ字典中删除HTTPS,因为人们依赖它,这意味着它们不会编写可移植的WSGI代码。您应该使用wsgi.url_scheme作为此答案的标准和保证方式,这将适用于WSGI。 – 2013-02-24 10:14:35

+0

@GrahamDumpleton是的,我刚刚在[mod_wsgi 3.4更新日志](https://code.google.com/p/modwsgi/wiki/ChangesInVersion0304)中阅读了相关内容。 – 2013-02-24 23:39:30

0

当使用CGI,WSGI或SSI时,您需要建议Apache发送HTTPS标头,否则它将为空。您可以在配置​​或的.htaccess做到这一点

<IfModule mod_env.c> 
    SetEnv HTTPS on 
</IfModule> 
+0

奇怪。我把它放在SSL虚拟主机中,并且它没有被传递。 – 2013-02-24 08:16:24

+0

今天笔者了解到(https://code.google.com/p/modwsgi/wiki/ChangesInVersion0304)条的mod_wsgi的HTTPS环境变量[3.4版本开始]并在mod_wsgi的应用程序依赖于它是不推荐使用。 – 2013-02-24 23:38:38

+0

那么,凯恩纳尔恩的答案就更好了。 – sjdaws 2013-02-24 23:58:58

相关问题