Při $this->redirect vloží do URL port

marty1452
Člen | 10
+
0
-

Zdravím,
Mám web, který běží za CloudFlarem, kde ssl certifikát řeší flexible proxy (tzn. na cloudflare se uživatel z prohlížeče připojuje šifrovaně a z cloudflaru na server už nešifrovaně).
A mám problém, že při každém $this->redirect se do URL propiše port 80.
Tzn.: z domény https://domena.cz po $this->redirect přesměruje na https://domena.cz:80/url
Nejspíše problém bude v Nette\Http\Url, kde schéma neodpovídá portu, konkrétně v tomto kódu:

public function getAuthority(): string
	{
		return $this->host === ''
			? ''
			: ($this->user !== ''
				? rawurlencode($this->user) . ($this->password === '' ? '' : ':' . rawurlencode($this->password)) . '@'
				: '')
			. $this->host
			. ($this->port && (!isset(self::$defaultPorts[$this->scheme]) || $this->port !== self::$defaultPorts[$this->scheme])
				? ':' . $this->port
				: '');
	}

Tak se chci zeptat jak toto co nejlépe řešit? Přepsat natvrdo port v indexu?
Děkuji za odpověď.

Editoval marty1452 (20. 4. 2021 10:52)

Marek Bartoš
Nette Blogger | 1260
+
0
-

Web ti běží za proxy. Tu je třeba nastavit v konfiguraci, aby Nette vědělo, že má reagovat na http hlavičky z proxy a nesnaží se je podstrčit uživatel. https://doc.nette.org/cs/configuring#…

marty1452
Člen | 10
+
0
-

Nastavil jsem proxy na IP webu (tedy IP, která běží na cloudflaru), ale stále to dělá stejný problém.

David Matějka
Moderator | 6445
+
0
-

tipoval bych, že se tam budou muset přidat všechny z následujících IP: https://www.cloudflare.com/ips/

marty1452
Člen | 10
+
0
-

Přidal jsem všechny tyto IP adresy, ale stále stejný problém.

David Matějka
Moderator | 6445
+
0
-

jaké hlavičky přicházejí od cloudflare? posílá se x-forwarded-proto?

marty1452
Člen | 10
+
0
-

Od cloudflare přichází cf-cache-status, cf-ray, cf-requested-id. Ale x-forwarded-proto se neposílá.

Barbarossa
Člen | 74
+
0
-

Ahoj @marty1452, povedlo se ti to nějak nakonec prosím vyřešit?
V IP proxy jsem zkoušel i 0.0.0.0/0

Editoval Barbarossa (29. 3. 2022 9:23)

h4kuna
Backer | 740
+
0
-

Trochu koukneme pod kapotu. V základu se RequestFactory řídí server proměnnými $_SERVER['HTTPS'], $_SERVER['HTTP_HOST'] a $_SERVER['SERVER_PORT']. Pokud dokážeš v konfiguraci cloudflare ovlivnit toto nastavení, není potřeba řešit proxy. Protože jsem to dělal v případě dockeru, konfigurace proxy byla nějak nastavená, pak se znovu instaloval docker a dalo to jiný IP adresy a úplně nastavení 0.0.0.0/0 nechceš na produkci, jen k otestování.

Tip: jednou na projektu bylo možné nastavit host:port tj. example.com:443 a tím se automaticky nastavila $_SERVER['HTTPS'] na on, $_SERVER['SERVER_PORT'] na očekávaných 443 a $_SERVER['HTTP_HOST'] na example.com

Tracy tip:
Když jsi za proxy pravděpodobně ti přestane fungovat spuštění tracy pomocí cookie, kde se to právě čte $_SERVER['REMOTE_ADDR'], tu je potřeba zkontrolovat, jestli tam je správná hodnota, stalo se mi že ip je ip proxy nikoliv návštěvníka, nebo v případě dockeru, to byla ip host mašiny.

Pokud z toho nic nastavit nemůžeš, musíš se vydat konfigurací proxy, jak radili výše.

Barbarossa
Člen | 74
+
0
-

Super díky, teď už vím co přesně to ovlivňuje. Jen ještě přemýšlím jak to změnit. Nejde o Cloudfare, ale o Google Cloud Balancer a nastavení změnit můžu, ale v zápětí mi to asi stejně přepíše Nginx.

$_SERVER['HTTPS'] mám On
$_SERVER['SERVER_PORT'] mám 80
$_SERVER['HTTP_HOST'] mám jen doménu app.example.com

V produkčním nginx můžu přidat něco takového fastcgi_param SERVER_PORT 443;, ale proč to tam nedá sám?

Btw v GKE nám všechny redirecty apod fungují, problém začal až s implementací na Cloud Run, tj tam někde musí být rozdíl v tom jak (z čeho) to Nginx zpracovává. V obou případech má, ale headers X-Forwarded-Proto=httpsX-Forwarded-For=someIps

EDIT: SERVER_PORT mám v GKE také 80, Nginx tam asi dává to samé co v jeho server listen. Ale koukám, že tam je rozdíl v hlavičce $_SERVER['HTTPS'] v GKE není a v cloud Run je On. Domněnka je taková, že to v GKE tedy Nette dosadí jako http://app.example.com:80/any/path a Balancer pak jen udělá redirect na HTTPS. Kdežto v případě Cloud Runu vygeneruje: https://app.example.com:80/any/path s čímž prohlížeč ani LB už nic neudělá (může to být samozřejmě validní request).

Editoval Barbarossa (29. 3. 2022 12:50)

h4kuna
Backer | 740
+
+1
-

Google Cloud Balancer neznám a dál ti neporadím s jeho nastavením, ale je jasný že není správně nastavená proměnná $_SERVER['SERVER_PORT']. Až se ti podaří do ni nastavit 443, tak to bude fungovat.