RealUrl
RealUrl je extension, která transformuje URL ze "škaredých" index.php?id=10 na hezké, třeba jako na tomto webu. Podmínkou pro fungování této extension je možnost nastavit pravidla ModRewrite na serveru Apache.
Ve stručnosti popišme, jak tato transformace funguje. Všechny url se díky pravidlům ModRewrite přepíší na index.php, který si s jejich zpracováním poradí. Způsobů, jakými lze generovat URL je nespočet mnoho. Záleží na jejich nastavení na v typo3conf. V zásadě lze brát názvy z URL z aliasu, to je ta jednodušší možnost. Složitější nastavení, které si zde popíšeme, transformuje URL především z názvů stránek. Dokonce zvládá i následovat zkratky, čímž dosáhnete toho, že jedna stránka nemá 2 různé URL. Např. pokud máte zkratku s ID 1 na stranu 2, tak index.php?id=1 i index.php?id=2 odkazují na stejnou stranu. RealUrl extension toto řeší.
Asi vás napadá, co se stane s češtinou v URL. Obecně v Typo3 je to problém, ale naštěstí RealUrl to zvládá na jedničku. Všechny znaky s diakritikou nahradí znaky bez diakritiky. Speciální znaky, jako ampersandy vynechá, a mezery nahradí čím budete chtít.
Instalace
Úplně jednoduše stačí stáhnou extension "RealURL: URLs like normal websites" s klíčem "realurl".
Dále je potřeba umístít do šablony tyto 3 řádky:
config.simulateStaticDocuments = 0
config.baseURL = www.example.org
config.tx_realurl_enable = 1
- řádek zakazuje simulování statických dokumentů
- řádek vloží do stránky element BASE. Jde o to, že v případě vícenásobného zanoření by přestaly relativní URL (třeba u obrázků) platit. Pozor na / na konci.
- řádek zapne RealUrl
localconf.php
Celé nastavení RealURL se umístí do souboru typo3conf/localconf.php. Je to tak nejsnazší, protože nastavení je samo o sobě dost dlouhé. Alespoň v případě, že chcete mít opravdu velmi hezké URL.
Standardní nastavení RealURL základní možnosti obsahuje, ale využívá v URL pouze alias stránky, takže se to nehodí pro více-jazyčné weby a tam, kde aliasy nemáte zadané.
Přímo do kódu jsem umístil popisky toho, co jednotlivé části nastavení dělají, takže si to stáhněte a hrajte si.
// aktivace skriptu, normalne udelane v ext/realurl/ext_localconf.php $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tstemplate.php']['linkData-PostProc'][] = 'EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL'; $TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-PostProc'][] = 'EXT:realurl/class.tx_realurl.php:&tx_realurl->decodeSpURL'; // nastaveni mazani cache z dalsich 2 tabulek, normalne udelane v ext/realurl/ext_localconf.php $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearAllCache_additionalTables']['tx_realurl_urldecodecache'] = 'tx_realurl_urldecodecache'; $TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearAllCache_additionalTables']['tx_realurl_urlencodecache'] = 'tx_realurl_urlencodecache'; // rekneme v jakem poradi se maji brat nazvy do URL. Polozky seznamu jsou nazvy sloupcu v tabulce pages $TYPO3_CONF_VARS['FE']['addRootLineFields'] .= 'tx_realurl_pathsegment,nav_title,title,alias'; $TYPO3_CONF_VARS["FE"]['pageNotFound_handling_statheader'] = 'HTTP/1.0 404 Not Found'; //dale jsou popisky vicemene v anglictine, jak jsem ziskal, tak davam dale // realurl config $TYPO3_CONF_VARS['EXTCONF']['realurl'] = array( '_DEFAULT' => array( 'init' => array( 'enableCHashCache' => 1, // 'appendMissingSlash' => 'ifNotFile', 'enableUrlDecodeCache' => 1, 'enableUrlEncodeCache' => 1, ), 'redirects' => array(), 'preVars' => array( //match &no_cache=1 with path prefix /nc array( 'GETvar' => 'no_cache', 'valueMap' => array( 'nc' => 1, ), 'noMatch' => 'bypass', ), //multiple language matching L=1 is replaced by /en //value are user defiened depending of the order you've inserted your //alternative language in TYPO3. See sys_language table for ID array( 'GETvar' => 'L', 'valueMap' => array( 'en' => '1', // 'english' => '1', 'de' => '2', // 'deutsch' => '2', ), 'noMatch' => 'bypass', ), ), // use extended page name rendering // page names are converted to readalbe page/sub-page/sub-sub-page.html 'pagePath' => array( 'type' => 'user', 'userFunc' => 'EXT:realurl/class.tx_realurl_advanced.php:&tx_realurl_advanced->main', // space is substituded with this 'spaceCharacter' => '-', 'languageGetVar' => 'L', // how many days, before the cache expires // if you change URL of a page, the old URL will be valid for X days 'expireDays' => 7, // if you have more sites in one instalation, use rootpage_id //'rootpage_id' => 2, 'segTitleFieldList' => 'tx_realurl_pathsegment,nav_title,title,alias' // 'encodeTitle_userProc'=>'EXT:realurl/tx_realurl_encodeTitle_userProc.php:&user_encodeDates', ), 'fixedPostVars' => array(), // match extension parameter // settings for tt_news extension 'postVarSets' => array( '_DEFAULT' => array( // archive 'period' => array( array( 'condPrevValue' => -1, 'GETvar' => 'tx_ttnews[pS]' , // 'valueMap' => array( // // ) ), array( 'GETvar' => 'tx_ttnews[pL]' , // 'valueMap' => array( // // ) ), array( 'GETvar' => 'tx_ttnews[arc]' , 'valueMap' => array( 'archived' => 1, 'non-archived' => -1, ) ), ), // pagebrowser 'browse' => array( array( 'GETvar' => 'tx_ttnews[pointer]', ), ), 'select' => array ( array( 'GETvar' => 'tx_ttnews[cat]', 'lookUpTable' => array( 'table' => 'tt_news_cat', 'id_field' => 'uid', 'alias_field' => 'title', 'addWhereClause' => ' AND NOT deleted', 'useUniqueCache' => 1, 'useUniqueCache_conf' => array( 'strtolower' => 1, ), ), ), ), // backPid link // 'back_to' => array( // array('GETvar' => 'tx_ttnews[backPid]', // 'lookUpTable' => array('table' => 'pages', // 'id_field' => 'uid', // 'alias_field' => 'title', // 'addWhereClause' => ' AND NOT deleted', // 'useUniqueCache' => 1, // 'useUniqueCache_conf' => array('strtolower' => 1, // 'spaceCharacter' => '-', // ), // ), // ), // ), 'article' => array( array( 'GETvar' => 'tx_ttnews[backPid]', ), array( 'GETvar' => 'tx_ttnews[tt_news]', 'lookUpTable' => array( 'table' => 'tt_news', 'id_field' => 'uid', 'alias_field' => 'title', 'addWhereClause' => ' AND NOT deleted', 'useUniqueCache' => 1, 'useUniqueCache_conf' => array( 'strtolower' => 1, 'spaceCharacter' => '-', ), ), ), array( 'GETvar' => 'tx_ttnews[swords]' ), ), ), ), // map some type to file name: rss.xml = &typo=100 'fileName' => array( 'index' => array( 'rss.xml' => array( 'keyValues' => array( 'type' => 100, ), ), // 'index.html' => array( // 'keyValues' => array(), // ), ), // add .html suffix to the end of the path generated 'defaultToHTMLsuffixOnPrev' => 1, ), ) );
.htaccess
Pro to, aby všechny URL byly přesměrovány na index.php je nutné přidat do souboru .htaccess tyto řádky:
RewriteEngine On
RewriteRule typo3$ - [L]
RewriteRule typo3/.*$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php
Pokud ovšem nemáte možnost .htaccess nastavit, máte pouze možnost nastavit VirtualHost, musíte sem přidat následující:
RewriteEngine On
RewriteRule /typo3$ - [L]
RewriteRule /typo3/.*$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* /index.php
Z vlastní zkušenosti, jsem ale zjistil, že na některých serverech takovéto nastavení nefunguje. Doma na localhostu mi jede bez problémů, ale v praxi se mi stalo, že se na index.php přepisovaly úplně všechny soubory, včetně obrázků.
Vyřešil jsem to tak, že jsem modifikoval poslední řádek na
RewriteRule .*\.html$ index.php