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
on 05.04.2009 15:13
on 05.04.2009 15:44
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
on 05.04.2009 15:45
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
on 05.04.2009 16:05
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
on 05.04.2009 16:35
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
on 05.04.2009 16:39
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.
on 05.04.2009 17:38
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'.
on 05.04.2009 18:06
Hi Gena, thx for the reply. Works perfectly as well! Bests, Pete