presmerovani nezohlednuje port

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

Rad bych otevrel vlakno: https://forum.nette.org/…lednuje-port

Apache mam na portu 8080 a pri presmerovani Presenter::redirect() se port ztrati.

v bootstrapu mam:

Uri::$defaultPorts['http'] = 8080;  // aby autoCanolizace zachovala port
$router[] = new Route('//admin.example.com/<presenter>/<action>/<id>', ...);

problem nastava v Route::constructUrl(), kde v $sequence[0] je jen adresa „//admin.example.com/“ bez portu.

Editoval Ondrej (13. 7. 2009 15:11)

Ondřej Mirtes
Člen | 1536
+
0
-

Jde ti o HTTPS? Jako třetí parametr routy uveď konstantu IRouter::SECURED.

Jod
Člen | 701
+
0
-

Píše, že mu ide o port 8080.

David Grudl
Nette Core | 8228
+
0
-

To Uri::$defaultPorts['http'] = 8080; by tam určitě být nemělo. Nezpůsobuje právě tohle zmíněný problém?

Ondrej
Člen | 110
+
0
-

David Grudl napsal(a):

To Uri::$defaultPorts['http'] = 8080; by tam určitě být nemělo. Nezpůsobuje právě tohle zmíněný problém?

v tom problem neni, nastaveni defaultniho portu tam musi byt pokud se pouziva canonicalize, protoze ta zohlednuje tento nastaveny port pri presmerovani na spravnou URL.

Problem pri generovani URL z routy je takovy, ze routa si nikde neuchova port, resp. si ani nijak neoznaci cast retezce, ktery oznacuje host. Vse jsou jen stringy v $sequence. Routa se spravne matchne na URL ve tvaru admin.example.com:8080/presenter/action , akorat zpet se nevygeneruje puvodni URL, ale pouze admin.example.com/presenter/action

kravčo
Člen | 721
+
0
-

Ondrej napsal(a):

v tom problem neni, nastaveni defaultniho portu tam musi byt pokud se pouziva canonicalize, protoze ta zohlednuje tento nastaveny port pri presmerovani na spravnou URL.

Nastavenie defaultného portu podľa mňa spôsobí práve to, že sa port z URI vynechá, viď Uri.

Ondrej
Člen | 110
+
0
-

OK, defaultPort jsem nechal vychozi 80, ale tim vznikla dalsi chyba pri generovani odkazu, ktera ale souvisi s vyse popsanym problemem generovani URL.

Ted nefunguje vygenerovani relativni URL, protoze v $hostUri je admin.example.com:8080 a v $uri je admin.example.com a proto se vygeneruje neplatny odkaz admin.example.com.
http://code.google.com/…resenter.php#1056
(nastavenim defaultPorts[‚http‘]=8080 jsem alespon vyresil relativni generovani URL)

Ondrej
Člen | 110
+
0
-

nakonec jsem to vyresil takto:

do Route.php jsem pridal:

	public function match(IHttpRequest $httpRequest)
	{
	$this->host = $httpRequest->getUri()->getHost();
	        $this->port = $httpRequest->getUri()->getPort();
		...
	}

	public function constructUrl(PresenterRequest $appRequest, IHttpRequest $httpRequest)
	{
		...
		do {
		if($sequence[$i] == '//'.$this->host.'/') $uri = '//'.$this->host . ':' . $this->port . '/' . $uri;
		else $uri = $sequence[$i] . $uri;
		if ($i === 0) break;
		...
	}

Nyni vse funguje: generovani odkazu, redirect i canonicalize :)

Routa je ve tvaru:

$router[] = new MySmartRoute('//admin.example.com/<presenter>/<action>/<id>', ...);
Ondřej Brejla
Člen | 746
+
0
-

A kdyby si to nechal tak jak si to měl předtím a routu by si měl ve tvaru:

$router[] = new MySmartRoute('//admin.example.com:8080/<presenter>/<action>/<id>', ...);

Tak by se to chovalo jak? Pro zajímavost…

Ondrej
Člen | 110
+
0
-

Warden napsal(a):
Tak by se to chovalo jak? Pro zajímavost…

tak by nefungoval match() ⇒ No route for HTTP request.

Ondřej Brejla
Člen | 746
+
0
-

Zajímavé…možná trochu škoda…