přesměrování nezohledňuje port

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

Pokud mi aplikace běží na http://localhost:8081/aplikace, tak pokud se v presenteru přesměrovávám metodou redirect na jiný presenter nebo view, tak zmizí port z adresy (http://localhost/aplikace/presmerovano).

David Grudl
Nette Core | 8228
+
0
-

Jak máš definované routy?

Honza Marek
Člen | 1664
+
0
-
$router[] = new Route('admin/<presenter>/<action>/<id>', array(
	'module' => 'Admin',
	'presenter' => 'Homepage',
	'action' => 'default',
	'id' => null
));

Pak mám ještě nějaké pro FrontModule, ale v něm nepřesměrovávám.

David Grudl
Nette Core | 8228
+
0
-

To je zvláštní, protože by se měly generovat absolutní cesty, tj. jen „/aplikace/presmerovano“.

Máš aktuální verzi Nette? Nemůže být chyba někde jinde?

Honza Marek
Člen | 1664
+
0
-

Nefunguje to ani v nejnovější verzi nette.

Když budu střílet hodně od boku, nemohlo by to souviset s úpravou nette proti IE7 bug – URL tvaru //example.com/path/, content-type header?

David Grudl
Nette Core | 8228
+
0
-

Honza M. napsal(a):

Nefunguje to ani v nejnovější verzi nette.

Když budu střílet hodně od boku, nemohlo by to souviset s úpravou nette proti IE7 bug – URL tvaru //example.com/path/, content-type header?

Tato změna se týká cest, které jsou zadány včetně domény, tj. třeba

$router[] = new Route('//example.com/admin/<presenter>/<action>/<id>', ...);
Honza Marek
Člen | 1664
+
0
-

Trochu jsem to zkoumal a zjistil jsem:

  • opravdu se generují relativní cesty (/aplikace/presmerovano)
  • ale v Application se ta cesta absolutizuje
  • Uri::getHostUri volá Uri::getAuthority a ta se už vrací bez portu
  • a proč, to už jsem nevyzkoumal
  • ale pomohlo by, kdyby se cesta neabsolutizovala

Editoval Honza M. (14. 11. 2008 16:44)

Honza Marek
Člen | 1664
+
0
-

Hm… $_SERVER["SERVER_PORT"] mi hlásí 80, přestože apache poslouchá na 8083. Nevím proč.

David Grudl
Nette Core | 8228
+
0
-

Díky za prozkoumání, tohle mi nedošlo. Absolutizace se provádí kvůli striktnímu chování podle HTTP normy, teoreticky by ji bylo možné odstranit, ale to není řešení problému, že. Můžeš zkusit vypsat phpinfo() a zjistit, jestli správný port není zjistitelný nějak jinak? Nebo ještě zkusit apache_* funkce v PHP?

Honza Marek
Člen | 1664
+
0
-

Z apache funkcí vypadá nadějně apache_request_headers. Vrací pole, kde pod klíčem "Host" mám "localhost:8083".

Anebo jednodušeji v proměnné $_SERVER["HTTP_HOST"] mám to samé.

Editoval Honza M. (15. 11. 2008 9:59)

David Grudl
Nette Core | 8228
+
0
-

Pokusil jsem se to zapracovat.

David Grudl
Nette Core | 8228
+
0
-

Funguje to už správně?

Honza Marek
Člen | 1664
+
0
-

No, nemám už ten počítač, na kterém mi to zlobilo.

Zkusil jsem to ale nasimulovat a zjistil jsem, že to funguje jen při správném nastavení ServerName (host:port) v httpd.conf. Tak si teď myslím, že chyba byla nejspíš tady.