Ruby Forum NGINX > passing header information on to backend Apache/PHP

Posted by Peter Langhans (Guest)
on 05.04.2009 15:13
(Received via mailing list)
Hi,

I'm using nginx 0.6.35, apache 2.0.63 and php 5.2.9.

My problem is, that I need my php scripts to know in some way or another
whether SSL is used or not (to include either https or http javascript 
files
e.g.).

When using nginx as webfrontend proxy, it accepts all the ssl 
connections
and it's working fine, but when I proxy through to apache, the knowledge
about SSL is 'lost'. If possible, I don't want to be using different 
ports
for proxying through to apache.

I thought it'd be enough to set headers like:

for 80:
proxy_set_header           X-Secure     of;

for 443:
proxy_set_header           X-Secure     on;

put I have not found a way how I could retrieve those values from within 
the
php script. They seem to be filtered out by Apache.

Does anyone have an idea how I can get any custom set header, set in the
nginx.conf through to the php scripts?

Thanks a lot,
Peter
Posted by Larry Bates (Guest)
on 05.04.2009 15:44
(Received via mailing list)
How about a rewrite rule that passes a parameter to your PHP script:



  _____

From: owner-nginx@sysoev.ru [mailto:owner-nginx@sysoev.ru] On Behalf Of 
Peter
Langhans
Sent: Sunday, April 05, 2009 8:03 AM
To: nginx@sysoev.ru
Subject: passing header information on to backend Apache/PHP


Hi,

I'm using nginx 0.6.35, apache 2.0.63 and php 5.2.9.

My problem is, that I need my php scripts to know in some way or another 
whether
SSL is used or not (to include either https or http javascript files 
e.g.).

When using nginx as webfrontend proxy, it accepts all the ssl 
connections and
it's working fine, but when I proxy through to apache, the knowledge 
about SSL
is 'lost'. If possible, I don't want to be using different ports for 
proxying
through to apache.

I thought it'd be enough to set headers like:

for 80:
proxy_set_header           X-Secure     of;

for 443:
proxy_set_header           X-Secure     on;

put I have not found a way how I could retrieve those values from within 
the php
script. They seem to be filtered out by Apache.

Does anyone have an idea how I can get any custom set header, set in the
nginx.conf through to the php scripts?

Thanks a lot,
Peter
Posted by Larry Bates (Guest)
on 05.04.2009 15:45
(Received via mailing list)
What about passing parameter to your PHP script using rewrite rule?

rewrite  ^(.*)$  http:// <http://<url to backend server or IP:port>/> 
<url to
backend server or IP:port>/login.php?proto=SSL

I might not be understanding your exact problem though.

-Larry Bates

  _____

From: owner-nginx@sysoev.ru [mailto:owner-nginx@sysoev.ru] On Behalf Of 
Peter
Langhans
Sent: Sunday, April 05, 2009 8:03 AM
To: nginx@sysoev.ru
Subject: passing header information on to backend Apache/PHP


Hi,

I'm using nginx 0.6.35, apache 2.0.63 and php 5.2.9.

My problem is, that I need my php scripts to know in some way or another 
whether
SSL is used or not (to include either https or http javascript files 
e.g.).

When using nginx as webfrontend proxy, it accepts all the ssl 
connections and
it's working fine, but when I proxy through to apache, the knowledge 
about SSL
is 'lost'. If possible, I don't want to be using different ports for 
proxying
through to apache.

I thought it'd be enough to set headers like:

for 80:
proxy_set_header           X-Secure     of;

for 443:
proxy_set_header           X-Secure     on;

put I have not found a way how I could retrieve those values from within 
the php
script. They seem to be filtered out by Apache.

Does anyone have an idea how I can get any custom set header, set in the
nginx.conf through to the php scripts?

Thanks a lot,
Peter
Posted by Peter Langhans (Guest)
on 05.04.2009 16:05
(Received via mailing list)
Hi Larry,

thx for that. I considered that as well, but I find the solution 
somewhat
"unelegant". It should either be identified by the port (which is hard 
due
to architecture setup in my case) or a header (which I would prefer).

Thx for hinting this solution out again. Maybe I really should consider 
it
and put my desire for 'compliable'/'elegant' solutions into the bin... 
:(
(which would hurt my heart).

Bests,
Pete
Posted by Peter Langhans (Guest)
on 05.04.2009 16:35
(Received via mailing list)
Larry,

thanks for your reply again. Sorry I stole your time for my own 
dumbness.

It's totally possible to do it via headers. The example I gave above, 
works
perfectly. I have just been too dump to test it in https (I tested in 
http)
and wondered why the header does not come through as expected :( Oh 
lord.

So just for reference. As the manual states correctly, you can pass any
header information on to your backend scripts via the

proxy_set_header           Header-Name    Header-Vale;

directive. Apache does NOT filter it out, and it's visible within PHP by
using one of the two following options:

1.) use the normal $_SESSION variable. CAVEAT: when using the $_SESSION
variable your header "Header-Name" becomes "HTTP_HEADER_NAME" (watch 
casing
and underscore instead of dash)

2.) use the apache_request_headers function to retrieve 
original/unchanged
values (http://uk.php.net/apache_request_headers)

Thanks for your time, folks!

Pete
Posted by Arvind Jayaprakash (Guest)
on 05.04.2009 16:39
(Received via mailing list)
On Apr 05, Peter Langhans wrote:
>about SSL is 'lost'. If possible, I don't want to be using different ports
>put I have not found a way how I could retrieve those values from within the
>php script. They seem to be filtered out by Apache.
>
>Does anyone have an idea how I can get any custom set header, set in the
>nginx.conf through to the php scripts?

Please show us your config and php script.
Posted by Gena Makhomed (Guest)
on 05.04.2009 17:38
(Received via mailing list)
On Sunday, April 5, 2009 at 16:02:34, Peter Langhans wrote:

PL> My problem is, that I need my php scripts to know
PL> in some way or another whether SSL is used or not
PL> (to include either https or http javascript files e.g.).

PL> When using nginx as webfrontend proxy, it accepts all the ssl
PL> connections and it's working fine, but when I proxy through to
PL> apache, the knowledge about SSL is 'lost'. If possible, I don't
PL> want to be using different ports for proxying through to apache.
...
PL> Does anyone have an idea how I can get any custom set header,
PL> set in the nginx.conf through to the php scripts?

nginx config:
=============

proxy_set_header X-Nginx-Scheme $scheme;

# nginx variable $scheme will be 'http' or 'https'.

apache config:
==============

SetEnvIf X-Nginx-Scheme "^https$" HTTPS=on

# Apache environment variable HTTPS will be 'on' or not defined.

PHP code:
=========

$scheme = getenv('HTTPS') && strtolower(getenv('HTTPS')) != 'off'
    ? 'https'
    : 'http';

# PHP variable $scheme will be 'http' or 'https'.
Posted by Peter Langhans (Guest)
on 05.04.2009 18:06
(Received via mailing list)
Hi Gena,

thx for the reply. Works perfectly as well!

Bests,
Pete