perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Torsten Förtsch <>
Subject Re: get the incoming TCP protocol type
Date Mon, 26 Nov 2012 10:57:05 GMT
On 11/26/2012 09:05 AM, André Warnier wrote:
> there is apparently a "server variable" HTTPS which can be tested in a
> RewriteCond, and which looks just like what I need :
>     Will contain the text "on" if the connection is using SSL/TLS, or
> "off" otherwise. (This variable can be safely used regardless of whether
> or not mod_ssl is loaded).
> Now I just have to find out how I can actually access such a "server
> variable" inside a mod_perl handler.  But that should be a breeze,
> considering the nice online mod_perl documentation, right ?
> Let's see if I can beat Torsten to it..

The problem is this "variable" is not something that is stored along
with the other request data. It is just the temporary result of a
function call.

What mod_rewrite does here to provide the "variable" is 2 things:

1) it looks for an optional function (this is a thing APR has invented)
named "ssl_is_https". In C it looks something like this:

  APR_OPTIONAL_FN_TYPE(ssl_is_https) *is_https;

If the function cannot be found HTTPS will be off because mod_ssl is not

2) then it calls the function, which returns a boolean value.

Apache2::ModSSL does exactly the same.

To make this variable accessible by means of mod_rewrite to mod_perl you

RewriteCond %{HTTPS} =on
RewriteRule .? - E=HTTPS:42

Later on in Perl you can ask

  if ($r->subprocess_env->{HTTPS} eq "42") ...

Mod_rewrite normally works in the uri translation phase, except when it
is called in a <Directory>, <Location> or <Files> block or a .htaccess
file. In this case it works in the fixup phase. Unfortunately,
mod_rewrite installs its handler with APR_HOOK_FIRST priority while
mod_perl uses APR_HOOK_REALLY_FIRST. That means a PerlFixupHandler is
called *before* mod_rewrite in directory context.


View raw message