Nginx – reverzní proxy a problém s https

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
cubic
Člen | 45
+
0
-

Ahoj,
tohle téma se tu už kdysi dávno řešilo, ale nenašel jsem nic, co by mi pomohlo..
Web běží na serveru, kde je Nginx jako reverzní proxy před Apachem. Aktuálně jsme nasadili SSL certifikát, bohužel Nette stále detekuje jako protokol http

V configu jsem nastavil

http
	proxy:
		- 127.0.0.1

To má za následek akorát generování absolutních odkazů jako https://domena.tld:80, takže nepoužitelné.

Tady je výpis proměnné $_SERVER:

Array
(
    [REDIRECT_STATUS] => 200
    [HTTP_HOST] => www.domain.com
    [HTTP_X_REAL_IP] => <moje IP>
    [HTTP_X_FORWARDED_FOR] => <moje IP>
    [HTTP_X_FORWARDED_PROTO] => https
    [HTTP_CONNECTION] => close
    [CONTENT_LENGTH] => 0
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => cs,en-US;q=0.7,en;q=0.3
    [HTTP_ACCEPT_ENCODING] => gzip, deflate, br
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_COOKIE] => ..........
    [PATH] => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    [SERVER_SIGNATURE] =>
    [SERVER_SOFTWARE] => Apache
    [SERVER_NAME] => www.domain.com
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => ......
    [REQUEST_SCHEME] => http
    [CONTEXT_PREFIX] =>
    [CONTEXT_DOCUMENT_ROOT] => ....
    [SERVER_ADMIN] => ....
    [SCRIPT_FILENAME] => ....
    [REMOTE_PORT] => 59160
    [REDIRECT_QUERY_STRING] => web=1
    [REDIRECT_URL] => /test/
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.0
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => web=1
    [REQUEST_URI] => /test/
    [SCRIPT_NAME] => /index.php
    [PHP_SELF] => /index.php
    [REQUEST_TIME_FLOAT] => 1470254555.569
    [REQUEST_TIME] => 1470254555
)
  1. Lze to nějak řešit, aniž bych musel definovat protokol napevno? (Na devu a na localu jede web na http, na produkci https, rád bych měl vždy jen jednu routu)
  2. Není jen chybně nastavený server (nginx)? Případně co přesně mám chtít po adminovi?

Předem díky za rady.

EDIT: použil jsem zatím https://gist.github.com/…fcca406a16cd, ale rád bych to vyřešil elegantěji, pokud to jde :-)

Editoval cubic (3. 8. 2016 22:44)

pata.kusik111
Člen | 78
+
+1
-

V Nette/Http je implementovaná podpora pro reverzní proxy, pokud správně implementují X_FORWARDED_* nebo FORWARDED hlavičky. Viz https://github.com/…tFactory.php#L200 Stačí v configu nastavit IP té proxy, aby jí Nette rozeznalo.

xr
Člen | 94
+
-2
-

A co Heroku a podobne platformy? Tam sa moze IP proxy menit.

Co pridat nastavenie, ktore sposobi, ze $usingTrustedProxy bude vzdy TRUE?

David Matějka
Moderator | 6445
+
+1
-

@xr muzes tam pouzivat CIDR notaci

Felix
Nette Core | 1196
+
0
-

xr napsal(a):

A co Heroku a podobne platformy? Tam sa moze IP proxy menit.

Co pridat nastavenie, ktore sposobi, ze $usingTrustedProxy bude vzdy TRUE?

To dosahnes i takto:

proxies: 1.0.0.0/1
Felix
Nette Core | 1196
+
0
-

V posledni verzi RequestFactory bylo opraveno detekovani portu podle schematu.

https://github.com/…4e7dc9da7bcd

newPOPE
Člen | 648
+
0
-

No neviem ako dana detekcia funguje ale ani hlavicky:

["REDIRECT_STATUS"]=> string(3) "200"
["ENVIRONMENT"]=> string(10) "production"
["HTTP_X_REAL_IP"]=> string(13) "xx.xx.xx.xx"
["HTTP_HOST"]=> string(15) "www.foo.bar"
["HTTP_X_FORWARDED_FOR"]=> string(13) "xx.xx.xx.xx"
["HTTP_X_FORWARDED_PROTO"]=> string(5) "https"
["HTTP_HTTPS"]=> string(2) "on"

nejak nepomahaju.

V doc je akurat toto „Abychom mohli používat HTTPS protokol, je nutné si správně nakonfigurovat server.“ co je trochu matuce. Rad tam pridam co tam byt ma resp. nejaky example len potrebujem vediet co znamena „spravne nastavenie“.

Editoval newPOPE (25. 7. 2017 14:16)