Route::SECURED a jiný port

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

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
+
0
-

@jan-kratochvil: Jak se projevuje problém? Jak vypadají definice rout? Máš tam explicitně ten port uvedený?

jan-kratochvil
Člen | 17
+
0
-

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
+
0
-

Zkusil bych:

$container->router[] = new Route('//example.com:444/<presenter>/<action>[/<id>]', 'Homepage:default', Route::SECURED);
jan-kratochvil
Člen | 17
+
0
-

To už jsem zkoušel, napíše to chybu:

No route for HTTP request

Jan Tvrdík
Nette guru | 2595
+
0
-

@jan-kratochvil: Zkus mi podrobněji popsat, jaký problém je, když tam ten port neuvedeš?

jan-kratochvil
Člen | 17
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

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