如何确定 apache2 httpd 模块中的连接是否已使用 encryption/SSL?

How to determine if a connection used encryption/SSL from apache2 httpd module?

在用 C 编写的 Apache2 模块的上下文中,如何确定请求 (request_rec *r) 是否已加密?我看过似乎可以做到这一点的代码,但我要么无法弄清楚如何实现它,要么总是 return 'true',即使在未加密的连接上也是如此。

在 PHP 中,如果使用 HTTPS,$_SERVER['HTTPS'] 将设置为 'on'。

在你自己的模块中,定义

#include <mod_ssl.h>

static int is_https(conn_rec *c)
{
    int (*is_https_conn)(conn_rec *c);
    is_https_conn = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https);
    if (is_https_conn)
        return is_https_conn(c);
    return 0;
}

因此您可以测试请求 request_rec *r 是否使用 SSL/TLS 连接,使用

if (is_https(r->connection)) {
   /* Yes, request is via an SSL/TLS-encrypted connection */
} else {
   /* No, the request is not via an encrypted connection */
}

逻辑是基于SSL/TLS模块使用APR_REGISTER_OPTIONAL_FN(ssl_is_https)modules/ssl/ssl_engine_vars.c:ssl_var_register()中注册函数ssl_is_https()。此函数采用连接 (conn_rec *),如果连接使用 SSL/TLS 加密 (HTTPS),则 return 非零。

我们使用 APR_RETRIEVE_OPTIONAL_FN(ssl_is_https) 来检索指向所述函数的指针。如果未注册,则此 returns NULL(显然没有连接可以加密)。如果它 return 是一个非 NULL 指针,我们就调用该函数。如果连接是 HTTPS,它将 return 非零。