Přesměrování na 404 page když chybí stránka?

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

Ř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
+
0
-

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 viewaction 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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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)

Ola
Člen | 385
+
0
-

Jo, to je asi nejlepší řešení, furt sem si na něj nemohl vzpomenout :)

kravčo
Člen | 721
+
0
-

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)

Kenn
Člen | 110
+
0
-

Inak, je nutné tie adresy meniť?

Nedovedu si představit že by to šlo bez beze změny. Zkusím nasadit překladový slovník nebo těch pár důležitých stránek prostě přesměruju ručně a bude

Ondřej Mirtes
Člen | 1536
+
0
-

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.

phx
Člen | 651
+
0
-

A co errorPresenter. Tam si muzes udelat stranku jakou chces.

Kenn
Člen | 110
+
0
-

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
+
0
-

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)