https mi automaticky presmeruje na http

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

ahojte
použivam posledne stabilné nette 0.9.2 stable
nette je môj prvý framework a mám takýto problém, testujem to len na localhoste, ale nemôžem žiadnym spôsobom donutit príklad s automatom na kávu aby mi bežal len pod https, po zadaní cesty https://localhost/kavomat ma prsmeruje automaticky na nezabezpečenú verziu čo nechcem. Mam server na testovanie, kde mám virtual host len na https a po zadaní presnej adresy sa zobrazí len chybové hlásenie server neodpovedal.
kedže s tým len začínam prosím o zhovievavosť, ak je potrebné uvediem všetky konfiguračné informácie

dakujem za akékoľvek nasmerovanie

Filip Procházka
Moderator | 4668
+
0
-

To bude nejspíš tím že router nemá nastavený příznak secured

dělá se to takhle:

$router[] = new Route('...', array(
	'presenter' => '...',
	'action' => '...',
), Route:SECURED);
vranacik
Člen | 9
+
0
-

Dakujem, za nakopnutie, nemyslel som že routovanie budem riešiť ako prvé :), funguje to čo potrebujem a viem ako pokračovať.

ešte raz dakujem

falkon
Člen | 17
+
0
-

Mam dotaz:

  • ako docielim toho, aby som tu istu aplikaciu mohol prevadzkovat na HTTP aj HTTPS?

Moja situacia:
mam aplikaciu, ktora ma velmi jednoduchu routu:

<?php
$router[] = new Route('<module>/<presenter>/<action>', array(
	'module' => 'public',
	'presenter' => 'Index',
	'action' => 'homepage'
));
?>

Ked na nu pristupujem cez HTTP, je vsetko v poriadku, jednotlive prikazy {link …} v sablonach mi generuju host-relative adresy (zacinajuce lomitkom). Problem je, ze ked na tu istu aplikaciu pristupim pomocou HTTPS, tak vsetky linky su vygenerovane ako kompletne URI – takze aj so schemou, hostom, atd. (v tvare: „http://example.com/base-url/my/path/to/skript?id=10“). Problemom je, ze to prave pouziva schemu HTTP a nie HTTPS, a teda po akomkolvek kliku je uzivatel nasmerovany naspat na nesifrovanu variantu.

Priznak Route::SECURED to nenapravi – pretoze to zase budu vsetky linky vygenerovane pouzitim HTTPS schemy (takze presne opacny problem).

Cielom je, aby sa linky vzdy generovali ako host-relative adresy, jedno ci som na HTTP alebo HTTPS spojeni.

Skusal som aj zdvojit danu routu a jednu kopiu nastavit ako SECURED, druhu nie, ale nezdalo sa, ze by to fungovalo.

Da sa to teda nejako nastavit? Je to BUG alebo feature?

Jan Tvrdík
Nette guru | 2595
+
0
-

Žádné dobré řešení mě nenapadá. Přidej si zatím to presenteru public $autoCanonicalize = FALSE a zduplikuj tu routu (jedno se secure jednou bez).

falkon
Člen | 17
+
0
-

A aky je zmysel takehoto chovania, ake Nette vykazuje v aktualnej verzii?

Jan Tvrdík
Nette guru | 2595
+
0
-

Pokud je obsah k dispozici na více adresách, tak vždycky přesměruje na jednu hlavní, čímž předchází duplicitám obsahu z hlediska SEO.

David Grudl
Nette Core | 8218
+
0
-

Málo se to ví, ale vyhledávače vnímají

http://example.com/stranka
https://example.com/stranka

jako dvě naprosto jiné adresy.

falkon
Člen | 17
+
0
-

Jan Tvrdík napsal(a):

Přidej si zatím to presenteru public $autoCanonicalize = FALSE a zduplikuj tu routu (jedno se secure jednou bez).

Tak $autoCanonicalize = FALSE v BasePresenter-i som uz nastavene mal, duplikacia rout nepomaha (vzdy sa Nette riadi tou, ktora je uvedena ako prva – ked dam prvu bez SECURED, vsetky linky sa smeruju na HTTP, ked je prava nastavena s priznakom SECURED, tak zase vsetko je smerovane na https. :(

Any other idea? Pripadne, ako napisat routu, ktora by sa ‚chytila‘ len na http/https? (ked dopredu nepoznam host-a ani basePath – takze URL je v obecnom tvare napr.: „http://subdomain.domain.com/base/url/module/presenter/action?id=10“ )

Odkial (= z akeho prostredia a kto ich poskytuje) sa daju ziskat premenne $basePath a $baseUri, ktore su dostupne v sablonach?

David Grudl napsal(a):

Málo se to ví, ale vyhledávače vnímají

http://example.com/stranka
https://example.com/stranka

jako dvě naprosto jiné adresy.

A tiez mi stale vrta v hlave otazka, ci je to naozaj ziadane chovanie, alebo ci je to chybicka. Chapem argumentu, ze http/https su brane ako 2 rozne adresy a teda auto-kanonizacia URL ich prevadza na jednotny standartny tvar (http/https podla nastavenia priznaku SECURED=false/true danej routy). Nicmenej, preco sa Nette sprava uplne rovnako aj pri vypnutej kanonizacii? Logicky spravne by mi prislo spravanie, pri ktorom:

  • ked dana routa neberie do uvahy schemu v ‚match‘-fazi (= ‚chyta‘ sa na http aj https), tak by ani pri generovani NEMALA tu schemu upravovat/menit.
  • ked dana routa berie schemu v ‚match‘-fazi do uvahy (vyzaduje ju k tomu, aby rozhodla ci ona je spravnou routou daneho poziadavku alebo nie), tak tuto schemu bude aj ‚vnucovat‘ v generovanych linkoch.

Pripada mi, ze priznak SECURED vykazuje len polovicu takehoto spravania – ovplyvnuje len fazu generovania, ale uz nevypoveda nic o faze ‚match‘-ovania danej routy. Takze hoci je zadana adresa nad http, tak sa uspesne match-ne aj SECURED routa. Nasledne vygenerovanie linku nad https je uz spravne.

Co ma v suvislosti s Davidovym vyjadrenim, ze adresy http://example.com/stranka a https://example.com/stranka su povazovane za dvě naprosto jiné adresy, privadza k nazoru, ze to je asi vazne Nette routing BUG. Pretoze ak tieto 2 adresy predstavuju rozne ‚zdroje‘, tak ich mozem obsluhovat roznymi modulmi/prezentermi/akciami, takze chcem pouzit 2 routy, ktore sa lisia prave schemou. Takze routa, ktora je „NOT_SECURED“ by sa nemala matchnut na adresy nad HTTPS a naopak. Dokazem si zivo predstavit prakticke priklady pouzitia takehoto chovania…

Co si o tom vsetkom myslite, a hlavne co si mysli David? :) Je moja uvaha v niektorom bode chybna/mylna? Unika mi nieco?

Vopred diky za pomoc.

falkon
Člen | 17
+
0
-

Nikoho nic nenapada, co s tym? :(

iguana007
Člen | 970
+
0
-

a co to zkusit vyřešit pomoci htaccess, to by nešlo?

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Mikulas Dite
Člen | 756
+
0
-

To zase všechny budou https. Jestli to dobře chápu, má http i https fungovat a bez redirectů na to druhé.

falkon
Člen | 17
+
0
-

Neslo – to neriesi problem generovania linkov. Navyse kazdy dotaz od klienta smerovany na HTTP by sposoboval 2× dotaz na server (1 povodny dotaz + presmerovany serverom na HTTPS). Navyse by to zase vsetko presmerovavalo na HTTPS a to nechcem.

Chcem len zachovavat schemu, ktoru si uzivatel vybral pre pristup na stranky.

worsik
Člen | 40
+
0
-

Ahoj,
ja to resim timto zpusobem v souboru bootstrap.php a mam bud vsecky HTTPS nebo vsecky HTTP podle toho, co mi uzivatel zadal do adresy

<?php
$flag = NULL;

if (Environment::getHttpRequest()->isSecured())
{
    $flag = SimpleRouter::SECURED;
}
// mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules()))
{
    $router[] = new Route('index.php', array(
    'presenter' => 'Default',
    ), Route::ONE_WAY);

    $router[] = new Route('<presenter>/<action>/<id>', array(
    'presenter' => 'Default',
    'action' => 'default',
    'id' => NULL,
    ),$flag);
}
else
{
    // vytvoreni jednosmerne routy, ktera bude odchytavat
    // vsechny dotazy smerujici na index.php
    // a presmerovavat na routu nize do cool-url tvaru
    // automaticky zohlednuje SEO,
    // takze se vam tyto stranky nezaindexuji dvakrat
    $router[] = new SimpleRouter(array(
    'presenter' => 'Default',
    'action' => 'default',
	),$flag);

    $router[] = new SimpleRouter(array(
        'presenter' => 'Default',
        'action' => 'default',
        'id' => NULL,
    ), $flag);
}
?>
vrana
Člen | 131
+
0
-

worsik

Díky moc. Takové jednoduché řešení, ale dumal jsem nad ním a hledal jsem ho asi hodinu.

setka
Člen | 10
+
0
-

Narazil jsem taky na tohle chování, a strašnou dobu jsem hledal chybu všude jinde než v Nette. V dokumentaci k Route o tom zmínka není. Měl jsem se podívat hned sem na fórum.

Můj první problém je, že v testovacím prostředí nemám HTTPS, a v produkčním je aplikace zase přístupná čistě jen přes HTTPS. Navíc aplikaci jako produkční provozuju na více různých serverech, kde někde chci a někde nechci HTTPS.

Řešení, co uvedl worsik funguje, ale nepřijde mi úplně čisté.

Podle mě by měla být konfigurační volba, která ovlivní chování pro všechny routy nezávisle na Route::SECURED flagu. Představuji si to tak, že po zapnutí nějaké volby bude chování přesně takové, jak popisuje původní tazatel – Nette si nebude všímat rozdílu mezi http a https, a vždy vygeneruje odkaz začínající /.

Vždyť je to podobná situace, jako když je obsah přístupný na různých portech přes HTTP – třeba z vnitřní sítě normálně na portu 80, ale z internetu třeba na 8080. To mám vyzkoušené, že Nette přesměrování nedělá.

Co myslíte, má to šanci jako feature-request?

viktorc
Člen | 21
+
0
-

Tiež som nad tym bádal prečo mi aplikácia nefungovala na produkčnom https a na vývojovom http bolo všetko ok. Naviac som mal v konfigurácii servera nastavené presmerovanie z http na https, takže sa to presmerúvalo stále dokola.

Nešlo by upraviť Route::constructUrl tak, aby preberal schému (http/https) z druhého parametra ($refUri) v prípade, keď nie je nastavený Route::SECURED flag? Súčasný spôsob mi pripadá zbytočne komplikovaný.

Teda zo zúčasného:

<?php
	// ...
	// riadok 365 v Route.php
	$uri = ($this->flags & self::SECURED ? 'https:' : 'http:') . $uri;
	// ....
?>

Napr. nejako takto:

<?php
	// ...
	// riadok 365 v Route.php
	$uri = ($this->flags & self::SECURED || $refUri->scheme == 'https'? 'https:' : 'http:') . $uri;
	// ....
?>

Verzia Nette: 2.0-dev, 7616569 released on 2011–03–10

Jan Tvrdík
Nette guru | 2595
+
0
-

IMHO je worsikovo řešení jednoduché a elegantní.

$flags = ($application->getHttpRequest()->isSecured() ? Route::SECURED : 0);
$router = $application->getRouter();
$router[] = new Router('<presenter>/<action>/<id>', array(...), $flags);

Pokud bych chtěl skutečně nastavit secured pro všechny routy, tak lze použít Route::$defaultFlags.

if ($application->getHttpRequest()->isSecured()) {
	Route::$defaultFlags = Route::SECURED;
}
viktorc
Člen | 21
+
0
-

Route::$defaultFlags je dobre (diky za tip), ale nie jednoduchšie, ako „nemusieť nastavovať vôbec nič“.
Možno lepšie chovanie by bolo:

  1. má routa SECURED flag? ⇒ bude https
  2. má routa (napr.) NOSECURED flag? ⇒ bude http
  3. nemá ani jeden z nich ⇒ protokol bude závisieť od aktuálneho protokolu ($refUri->scheme)

Takto by išlo routam vynútiť http, https a fungoval by aj default – podľa protokolu aktuálnej požiadavky. Je to na zamyslenie.

Jan Tvrdík
Nette guru | 2595
+
0
-

Řešení, které navrhuješ mi nepřipadá špatné (i když NOSECURED zní divně), ale nevím, zda se HTTPS používá tak často, aby to mělo smysl řešit. Pravdou ale je, že David chtěl používání HTTPS v Nette zjednodušit a toto by mohl být jeden ze způsobů.

V současné době ale považuji přidání jednoho řádku za dostatečně pohodlné řešení.

Route::$defaultFlags |= ($application->getHttpRequest()->isSecured() ? Route::SECURED : 0);
theo
Člen | 57
+
0
-

Na problém jsem narazil i v Nette 2.0 a protože nemám možnost doplnit potřebné znalosti do dokumentace, kde zoufale chybí, píšu alespoň sem jak jsem problém vyřešil. Jak známo v Nette 2.0 neexistuje ani objekt Application tudíž nemůže mít ani metodu getHttpRequest() a problém se tak řeší trochu oklikou přes getService(‚httpRequest‘). Snad tím ušetřím tápání v naprosto nedostačující dokumentaci těm méně znalým:

<?php
Route::$defaultFlags |= ($container->getService('httpRequest')->isSecured() ? Route::SECURED : 0);
?>

PS: byl by opravdu takový problém lidem, kteří mají účet ve fóru, (případně nějak dále vybraným) dát možnost opravovat a doplňovat dokumentaci? Ušetřila by se tím spousta času a nervů těch, kdo v ní marně něco hledají (než pochopí, že nejvíc se toho dozví stejně na fórech).

MartinitCZ
Člen | 580
+
0
-

@**theo**: Práva pro editaci nemůžeš dát každému.
Jinak tvůj kod můžeš napsat i takto:

$defaultFlags |= ($container->httpRequest->isSecured() ? Route::SECURED : 0);