【问题标题】:How do I determine if my mod_wsgi application is running on HTTPS?如何确定我的 mod_wsgi 应用程序是否在 HTTPS 上运行?
【发布时间】:2013-02-24 07:06:26
【问题描述】:

我刚刚继承了一个在 Apache 2.4、mod_wsgi 3.4 和 Python 2.7 下运行的 Python 应用程序。同一个应用程序同时处理 HTTP 和 HTTPS 请求。

在现有代码中,它试图通过检查环境来确定请求是否为HTTPS:

if context.environ.get('HTTPS') not in ['on', '1']:

此检查失败,即使连接实际上是 HTTPS。在查看显示环境变量的扩展回溯时,我看到 HTTPS 实际上并不在从 Apache 传递的环境中。

所以我的问题是:

  • 这是 Apache 配置问题吗?
  • 此检查是否完全错误并且应该重写以检查其他内容?如果是,是什么?
  • 或者我应该像我真正想做的那样放弃并用 nginx 替换 Apache?

【问题讨论】:

  • 你确定python是compiled with support for SSL吗?
  • @sjdaws hasattr(socket, "ssl") 为我返回 True
  • Apache 代理是否总是传递给 http://backend 而不是代理传递 SSL 连接到 https://backend
  • 它根本没有使用代理,它使用SetHandler wsgi-script
  • 检查这一点的规范方法是查看wsgi.url_scheme 环境变量。规范保证那个是存在的。

标签: python https apache2 mod-wsgi


【解决方案1】:

Apache的mod_ssl可以配置为设置HTTPS环境变量,但doesn't do so by default出于性能考虑。

您可以显式启用它,但由于您使用的是 WSGI 应用程序,因此最好检查 wsgi.url_scheme 环境变量; WSGI 规范保证了它的存在,如果您最终迁移到 nginx,它不需要对您的应用程序进行任何进一步的更改。

【讨论】:

  • 有趣。我已经设置了SSLOptions +StdEnvVars。并且所有列出的变量 except HTTPS 都被传递了。无论如何,我喜欢便携的东西,所以这看起来像我要走的路。
  • 在最近的 mod_wsgi 版本中,它会故意从 WSGI 环境字典中删除 HTTPS,特别是因为人们依赖它,这意味着他们没有编写可移植的 WSGI 代码。您应该使用此答案所示的 wsgi.url_scheme 作为适用于 WSGI 的标准且有保证的方式。
  • @GrahamDumpleton 是的,我刚刚在mod_wsgi 3.4 changelog 中读到过。
【解决方案2】:

当使用 CGI、WSGI 或 SSI 时,您需要建议 Apache 发送 HTTPS 标头,否则它将为空。您可以在配置中使用 mod_env 或 .htaccess

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

【讨论】:

  • 奇怪。我把它放在 SSL 虚拟主机中,它仍然没有被传递。
  • 今天我了解到beginning with version 3.4, mod_wsgi 会剥离 HTTPS 环境变量,不建议在 mod_wsgi 应用程序中依赖它。
  • 这让@Cairnarvon 的回答变得更好。
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多