Hi Andre,

 see below. You are not going to hear me slapping my face, but definitely doing 
"ahhhh!" :-)

Cheers

Martin 
------------------------------------------------------
Martin Knoblauch
email: k n o b i AT knobisoft DOT de
www:   http://www.knobisoft.de



----- Original Message ----
> From: André Warnier <a...@ice-sa.com>
> To: Tomcat Users List <users@tomcat.apache.org>
> Sent: Fri, May 27, 2011 6:01:28 PM
> Subject: Re: Weird problerm accessing request headers  from tomcat
> 
> Hi.
> 
> I believe that you are making the often-made confusion between  "environment 
>values" (or variables), and HTTP headers content.
> In particular,  here :
> 

 seems you are right.

> >>  Apache1 inserts the following variables into the  requests it forwards to 
>Apache1 (I suppose you meant Apache2 here)
> 
> No. It  does not do that.  It adds some HTTP headers. This is different, see  
>below.
> 
> . Apache1 (I suppose you meant Apache2 here) can see them, I have  checked 
> that 
>using cgi-bin/printenv (some
> >> values  anonymized):
> >> 
> >>  HTTP_X_FORWARDED_FOR="aa.bb.cc.dd"
> >>  HTTP_X_FORWARDED_HOST="xxx.yyy.net"
> >>  HTTP_X_FORWARDED_PORT="443"
> >>  HTTP_X_FORWARDED_PROTOCOL="https"
> >>  HTTP_X_FORWARDED_SERVER="aaa.bbb.ccc"
> >> 
> Your check does not show  that at all. It shows something that is just 
>confusing enough to get you  confused as to what you are seeing. ;-)
> 
> But you have excuses for your  confusion, because the Apache documentation 
>itself is very confusing as to  "environment variables".
> 

 Indeed, the documentation leaves this pretty diffuse.

> What the cgi-bin script sees, are indeed  "environment values".
> These are set by the Apache process (Apache2), just  before it executes the 
>cgi-bin script. So the cgi-bin script sees them in its  environment when it 
>runs.
> (like with  $ENV{'HTTP_X_FORWARDED_PORT'})
> 
> But there is no one-to-one relationship  between what Apache finds in HTTP 
>request headers, and the environment values  which it sets for the cgi-bin 
>scripts that it runs.
> Apache does "convert"  some of the request HTTP header values into cgi-bin 
>environment variables, but  :
> - the name of the environment variable may be different from the  
> corresponding 
>HTTP header label (you see this yourself above : a HTTP header  named 
>"X-forwarded-for:" has been passed to the cgi-bin script as the  environment 
>value named "HTTP_X_FORWARDED_FOR")
> - not all HTTP headers are  converted and passed that way
> - some environment values passed to the cgi-bin  script are not, and never 
>were, HTTP headers of the request (for example, the  cgi-bin environment 
>values 
>"QUERY_STRING", or "SCRIPT_FILENAME")
>

 Ok, that definitely explains what I am seeing.
 
> On the  other hand :
> 
> When a HTTP proxy server forwards a HTTP request to another  HTTP server via 
>the HTTP protocol, it forwards *all* the request headers and  request content 
>to 
>this other server, as a HTTP request (otherwise, it would not  be a valid HTTP 
>proxy server).  But it cannot forward "environment values",  because there is 
>no 
>defined way of doing this over the HTTP protocol.  (*)
> 
> 
> But now I see your second post, and your problem is in fact much  simpler.
> 
> By doing this :
> h:outputText style="font: bold 14px  sans-serif;"
> >                  value="X_FORWARDED_HOST: #{header['X_FORWARDED_HOST']}" />
> 
> what you  are actually trying to retrieve, is the content of the HTTP request 
>  
>header
> "X_FORWARDED_HOST:" (I guess), but this HTTP header does not exist in  the 
>request.
> What you are giving as a HTTP header name, is actually what the  cgi-bin 
>environment value name was for your cgi-bin.
> Which, as I try to  explain at long length above, is not the same thing.
> 
> So you get back a  null, and you think that the header was not there.
> But it is there, only  under its real HTTP header name.
> Try something like
>    value="X_FORWARDED_HOST: #{header['X-Forwarded-for']}"  />"
> instead.
>

 Yup, using "X-Forewarded-Host" works as expected. Thanks a big lot.
 
> (Noise of self-slap on face ?).
> 

As I said above: no self slapping. Just amazement on how much there is still to 
learn after all these years :-)

> 
> 
> (*)  However, when the proxy protocol used is AJP (as it is between Apache 
> and 
>Tomcat  when using the mod_jk connector, or the mod_proxy_ajp connector), 
>/then/ 
>some  additional values /can/ be passed along with the request (because the 
>AJP  
>protocol allows that). On the Tomcat side, these then appear as "request  
>attributes" which the webapp can retrieve (via request.getAttribute(name)), 
>but  
>not as "environment values" of the Tomcat process for  example.
> 
> ---------------------------------------------------------------------
> To  unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For  additional commands, e-mail: users-h...@tomcat.apache.org
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to