Při $this->redirect vloží do URL port
- marty1452
- Člen | 10
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 | 1274
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#…
- David Matějka
- Moderator | 6445
tipoval bych, že se tam budou muset přidat všechny z následujících IP: https://www.cloudflare.com/ips/
- Barbarossa
- Člen | 74
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
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
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=https
a X-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)