https mi automaticky presmeruje na http
- vranacik
- Člen | 9
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
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);
- falkon
- Člen | 17
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
Žá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).
- Jan Tvrdík
- Nette guru | 2595
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
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
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.
- Mikulas Dite
- Člen | 756
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
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
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);
}
?>
- setka
- Člen | 10
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
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
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
Route::$defaultFlags je dobre (diky za tip), ale nie jednoduchšie, ako
„nemusieť nastavovať vôbec nič“.
Možno lepšie chovanie by bolo:
- má routa SECURED flag? ⇒ bude https
- má routa (napr.) NOSECURED flag? ⇒ bude http
- 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
Ř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
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
@**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);