Přesměrování na 404 page když chybí stránka?
- Kenn
- Člen | 110
Řeším drobný problém. Předělával jsem starý statický web na novou verzi využívající Nette. Vyhledávače mají zaindexované staré stránky s koncovkou *.htm, proto bych potřeboval, aby se adresa typu web.cz/stranka.htm přesměrovala na nějakou informační stránku nebo klasickou 404ku. Nette totiž automaticky vykresluje stránku, která však nic nezobrazí.
Zkoušel jsem něco takového, jenže bez účinku.
<?php
$router[] = new Route('<? \.html?|\.htm>', array(
'presenter' => 'Default',
'view' => 'Default',
'nazev' => '404',
), Route::ONE_WAY);
?>
Díky za všechny rady :-)
- pmg
- Člen | 372
Na co se ptáš, by nejspíš mělo vypadat takto:
$router[] = new Route('<? .+\.html?>', array(
'presenter' => 'Default',
'action' => 'default',
'nazev' => '404',
), Route::ONE_WAY);
Maska musí sedět na celé relativní URL, proto bylo nutné přidat
.+
. Povšimni si také záměny view
⇒
action
a malého písmena u druhého názvu default
,
jde o coding standard.
Možná by ale bylo vhodnější stránku končící .html
přesměrovat na nové URL? Když má routa příznak ONE_WAY
, při
generování adresy se nepoužije. Stačí tedy za touto routou definovat
nějakou normální a Nette při zadání staré adresy automaticky přesměruje
na správnou formu.
$router[] = new Route('<nazev .+><? \.html?>', array(
'presenter' => 'Default',
'action' => 'default',
), Route::ONE_WAY);
- Ondřej Mirtes
- Člen | 1536
Jojo, vždyť není problém hodit uživatele přes 301 Moved Permanently přímo na ten přesunutý obsah a neztratit tak nic z pageranku daných stránek. Případně pomocí Nette přijímat/generovat adresy na novém webu ve stávajícím tvaru.
- Kenn
- Člen | 110
LastHunter napsal(a):
Jojo, vždyť není problém hodit uživatele přes 301 Moved Permanently přímo na ten přesunutý obsah a neztratit tak nic z pageranku daných stránek. Případně pomocí Nette přijímat/generovat adresy na novém webu ve stávajícím tvaru.
Nedovedu si dost dobře představit jak to udělat, leda nadefinovat všechny původní stránky aby se to dalo nějak programově přesměrovávat.
- kravčo
- Člen | 721
Ako písali pmg a LastHunter, bolo by vhodnejšie presmerovať staré adresy stránok na ich nové verzie ako hlásiť 404. Okrem pageranku to má aj tú výhodu, že všetky doterajšie externé odkazy zostanú platné i naďalej.
Predpokladám, že keď stránku prerábaš, adresa
web.cz/produkty.htm
má nejakú svoju novú verziu aj v ponettenom
webe, povedzme Stranka:zobraz?meno=produkty
(prezenter:action?parametre).
Ak je ten priemet takýto jednoduchý, stačí pridať ako prvý tento jednosmerný router:
$router[] = new Route('<meno><? \.html?>', array(
'presenter' => 'Stranka',
'action' => 'zobraz',
), Route::ONE_WAY);
V prípade, že sú tie zmeny komplikovanejšie, je možnosť napísať na to špeci router, alebo spraviť jeden prezenter, na ktorý budú smerované tieto staré odkazy a ten bude podľa nejakej svojej logiky volať redirect na správny odkaz v novej verzii.
- Ola
- Člen | 385
Nebo by si taky mohl vytvořit speciální presenter který naroutovat na
*.htm/*.html
, v něm by bylo asociativní pole ve tvaru stará
adresa ⇒ nová adresa a na tu by potom přesměroval s kódem 301 .. Ale
vlastní router mi přijde lepší (v presenteru se nemusí řešit část
kterou by měl dělat router)
EDIT: sakra, že já si nepřečetl předchozí příspěvek až do konce ..
Editoval Ola (21. 4. 2009 21:29)
- pmg
- Člen | 372
Nebo k routě přidat překladový slovník.
Route::addStyle('nazev');
Route::setStyleProperty('nazev', Route::FILTER_TABLE, array(
'stary-nazev' => 'cokoliv',
));
Editoval pmg (21. 4. 2009 22:02)
- kravčo
- Člen | 721
pmg napsal(a):
Nebo k routě přidat překladový slovník.
Mám pocit, že prekladový slovník nevyrieši tento problém… Ten len ponúka alternatívne názvy pre prezentery, akcie a ostatné parametre.
Inak, je nutné tie adresy meniť? Totiž je možné aj to, že routovanie po novom nastavíš presne na rovnaké adresy, aké si mal doteraz, stačí použiť router:
$router[] = new Route('<meno><? \.html?>', array(
'presenter' => 'Stranka',
'action' => 'zobraz',
));
(rovnaký ako predtým len bez jednosmerného príznaku)
- Ondřej Mirtes
- Člen | 1536
Záleží, kolik jich tam bylo a jakého jsou typu. Pokud byly všechny v jedné složce, končily .htm a měli různou funkčnost, tak to do jedné routy nezobecníš, ale třeba tam mezi nimi nějaký vztah, kdy se to na presentery-actiony bude moct dát převést, je.
- Kenn
- Člen | 110
No nakonec to asi vyřeším tak, že těch pár důležitých stránek, které mají chytnuté vyhledávače a které mají nějaké ranky prostě přesměruju natvrdo. Jiné řešení nevidím, protože všechny stránky byly v rootu webu a všechny byly typu .htm., kdyžto nové adresy jsou formou presenter/view/promenna a web používá 3 presentery.
- xificurk
- Člen | 121
Kenn napsal(a):
No nakonec to asi vyřeším tak, že těch pár důležitých stránek, které mají chytnuté vyhledávače a které mají nějaké ranky prostě přesměruju natvrdo. Jiné řešení nevidím, protože všechny stránky byly v rootu webu a všechny byly typu .htm., kdyžto nové adresy jsou formou presenter/view/promenna a web používá 3 presentery.
Jestli má web aspoň přibližně stejnou strukturu, tak by to mělo jít vyřešit něčím takovým:
<?php
Route::addStyle('#oldpages-presenter1', 'action');
Route::setStyleProperty('#oldpages-presenter1', Route::PATTERN, '(stary-nazev1)|(stary-nazev2)');
Route::setStyleProperty('#oldpages-presenter1', Route::FILTER_TABLE, array(
'stary-nazev1' => 'noveAction1',
'stary-nazev2' => 'noveAction2',
));
$router[] = new Route('/<action #oldpages-presenter1>.htm', array(
'presenter' => 'Presenter1',
), Route::ONE_WAY);
?>
Editoval xificurk (24. 4. 2009 17:37)