Route::SECURED a jiný port
- jan-kratochvil
- Člen | 17
Ahoj všem, potřebuji použít Route::SECURED ale na port 444, jak to mohu nejjednodušeji udělat? Díky Honza
- Jan Tvrdík
- Nette guru | 2595
@jan-kratochvil: Jak se projevuje problém? Jak vypadají definice rout? Máš tam explicitně ten port uvedený?
- jan-kratochvil
- Člen | 17
No nevím, jak ho tam dát, používám tuto konfiguraci:
$container->router[] = new Route(‚<presenter>/<action>[/<id>]‘, ‚Homepage:default‘, Route::SECURED);
ale to routuje na 443
- Jan Tvrdík
- Nette guru | 2595
Zkusil bych:
$container->router[] = new Route('//example.com:444/<presenter>/<action>[/<id>]', 'Homepage:default', Route::SECURED);
- Jan Tvrdík
- Nette guru | 2595
@jan-kratochvil: Zkus mi podrobněji popsat, jaký problém je, když tam ten port neuvedeš?
- jan-kratochvil
- Člen | 17
No když port neuvedu, tak to funguje na 443, kde mám ovšem jiný SSL web. Budu muset asi rozchodit NameBasedSSLVHosts, to ten problém vyřeší…
- Jan Tvrdík
- Nette guru | 2595
@jan-kratochvil: Pořád nechápu ten problém.
Přijdu na tvůj web https://example.com:444
, co se stane?
- jan-kratochvil
- Člen | 17
Jan Tvrdík napsal(a):
@jan-kratochvil: Pořád nechápu ten problém. Přijdu na tvůj web
https://example.com:444
, co se stane?
No zkusím to popsat tedy včetně včech detailů, jenom ještě shrnu, že požadavek je mít celý web SSL a na portu 443 mi běží již jeden, takže potřebuji port 444.
Pokud mám router nastavený na:
$container->router[] = new
Route(‚<presenter>/<action>[/<id>]‘,
‚Homepage:default‘);
Tak při požadavku https://example.com:444 to evidentně router přesměruje na http://example.com:444 (port asi nechá) a prohlížeč vypíše toto:
<script>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://example.com/"><b>https://example.com/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.22 (Ubuntu) Server at example.com Port 443</address>
</body></html>
</script>
No a pokud mám router nastavený takto:
$container->router[] = new
Route(‚//example.com:444/<presenter>/<action>[/<id>]‘,
‚Homepage:default‘, Route::SECURED);
Tak to udělá server error 500:
No route for HTTP request
- Majkl578
- Moderator | 1364
Před pár dny jsem se setkal s tímtéž a nezáleží na tom, zda jde
o SSL nebo ne. Projevuje se to i při atypickém portu a použití
HTTP. Zkrátka pokud se v routě uvede port, routa nefunguje.
Zároveň je problém pokud definuji absolutní routu bez portu a pak k webu
přistoupím např. z portu 81 – dochází ke kanonizaci na port 80.
A ještě jeden poznatek: maska se zřejmě převede na regulár v pořádku, nicméně přinejmenším jeden problém je v tom, že Route::match() zcela ignoruje porty u absolutních masek, zde.
Příklad #1:
- ignorujme HTTP/HTTPS a mějme routu //example.com:123/
- v prohlížeči vlezeme na http://example.com:123/
- Nette vyhodí výjimku, routa není matchnuta
Příklad #2
- ignorujme HTTP/HTTPS a mějme routu //example.com/
- v prohlížeči vlezeme na http://example.com:123/
- Nette přesměruje na http://example.com/
- tohle je teoreticky správné chování, jde o kanonizaci (řešitelné dynamickým sestavením masky na základě portu); abych objasnil proč tohle potřebuji, např. na 80 mám nginx, na 81 apache, popř. na různých portech různé verze PHP
Issue na GitHubu: https://github.com/…/issues/1268