Podle typu se změní pole níž i podoba vygenerovaného pravidla.
Trvalé přesměrování přenáší hodnocení ve vyhledávačích a prohlížeče si ho pamatují. Na dočasnou změnu použijte 302.
Redirect je kratší, ale přesměruje i vše pod zadanou cestou. RewriteRule umí přesnou shodu, podmínky i query string.
Stačí cesta od lomítka. Celou adresu nástroj zkrátí sám a speciální znaky escapuje pro regulární výraz.
Cesta na témže webu, nebo celá adresa včetně https:// při přesunu na jinou doménu.
Pravidlo si doménu odvodí z požadavku, takže ho nemusíte upravovat.
Doplnění se týká jen existujících adresářů, odebrání naopak všeho, co adresář není.
Podmínka pak čte hlavičku X-Forwarded-Proto, protože %{HTTPS} je za proxy vždy vypnuté.
Blok patří do souboru .htaccess v kořenové složce webu, ideálně nad pravidla redakčního systému.
Jak generátor přesměrování použít
- Vyberte typ pravidla. Nabídka pokrývá jednu URL, adresář, celou doménu, sjednocení www, vynucení HTTPS, lomítko na konci a vlastní regulární výraz.
- Zvolte kód přesměrování. Trvalé 301 pro definitivní přesun, dočasné 302, když se adresa zase vrátí.
- Doplňte zdrojovou a cílovou adresu. Speciální znaky se do regulárního výrazu ošetří samy.
- U pravidel, kde je volba na místě, se rozhodněte mezi mod_alias a mod_rewrite. Rozdíl je popsaný níže.
- Zkopírujte vygenerovaný blok do souboru .htaccess v kořenové složce webu, ideálně nad pravidla redakčního systému.
Rozdíl mezi 301 a 302 přesměrováním
Rozdíl mezi trvalým a dočasným přesměrováním není kosmetický, protože každý z nich vede k jinému chování prohlížeče i vyhledávače.
| Kód | Význam | Metoda požadavku | Ukládá se do cache |
|---|---|---|---|
| 301 | Trvale přesunuto | POST se může změnit na GET | Ano, i bez pokynu serveru |
| 302 | Nalezeno, dočasně | POST se může změnit na GET | Ne |
| 307 | Dočasné přesměrování | Metoda zůstává zachovaná | Ne |
| 308 | Trvalé přesměrování | Metoda zůstává zachovaná | Ano, i bez pokynu serveru |
Pro Google je 301 signál, že správnou adresou je ta cílová, takže původní URL z indexu postupně zmizí. U 302 vyhledávač přesměrování následuje, ale cílovou adresu jako kanonickou nebere a stará URL může v indexu zůstat. Tvrzení z různých článků, že 301 „předá určité procento odkazové autority“, v dokumentaci Google nenajdete. Jde o kanonizaci, ne o převod hodnoty.
Kódy 307 a 308 se od 301 a 302 liší jedinou věcí: nedovolují změnit metodu požadavku. Pokud tedy přesměrováváte adresu, na kterou se posílá formulář metodou POST, sáhněte po nich. U běžných stránek stačí 301 a 302, a 308 má navíc v normě poznámku, že je mladší a starší klienti ho nemusí znát.
mod_alias nebo mod_rewrite, co použít
Dokumentace Apache je v tomhle jednoznačná a na jednoduché přesměrování jedné adresy nebo skupiny adres patří direktivy Redirect a RedirectMatch z modulu mod_alias, ne RewriteRule. Jsou jednodušší na čtení a rychlejší.
Má to ale dvě omezení, na která se snadno narazí. Redirect porovnává jen celé segmenty cesty a všechno pod zadanou adresou přesměruje s ní. Pravidlo pro /sluzby tedy zabere i na /sluzby/konzultace, což je někdy přesně to, co chcete, a jindy nepříjemné překvapení. Když potřebujete zabrat jen na jedné adrese, je řešením RedirectMatch se vzorem ukotveným na konci.
Druhé omezení je zásadnější: mod_alias pracuje pouze s cestou. Neumí se rozhodovat podle domény ani podle parametrů v dotazu. Sjednocení www, vynucení HTTPS a jakékoli pravidlo závislé na hostiteli proto vyžadují RewriteRule spolu s podmínkou RewriteCond. Generátor to řeší za vás a u těchto typů volbu modulu vůbec nenabídne, protože jiná možnost není.
Proč pravidlo nefunguje
Úvodní lomítko ve vzoru. Nejčastější chyba vůbec. V souboru .htaccess se vzor RewriteRule porovnává s cestou, ze které Apache úvodní lomítko odstranil. Vzor začínající ^/ tam proto nesedne nikdy. Dokumentace to říká přímo, a je to jediný rozdíl proti konfiguraci virtuálního hostu, kde lomítko naopak být musí. Takové pravidlo generátor odmítne vygenerovat.
Zapamatované přesměrování 301. Norma dovoluje prohlížeči podržet si trvalé přesměrování v cache i tehdy, když server nic o platnosti neřekl. Když pak pravidlo opravíte, prohlížeč vás pořád posílá na starou adresu a vypadá to, že úprava nezabrala. Testujte v anonymním okně nebo přes curl -I. Při ladění se vyplatí nasadit nejdřív 302 a přepnout na 301 teprve po ověření.
Nechtěně zachovaný dotaz. Když má zdrojová adresa parametry a cíl žádné, RewriteRule původní dotaz k cíli sám připojí. Z /hledat?q=neco se tak stane /najit?q=neco, i když jste to nechtěli. Zahodí ho příznak QSD, který se do pravidla doplní sám, jakmile cíl vlastní dotaz nemá.
Přesměrování na kotvu bez příznaku NE. Pokud cíl obsahuje znak #, Apache ho ve výchozím stavu zakóduje na %23 a z fragmentu se stane součást cesty. Přesměrování pak skončí na adrese, která neexistuje. Řeší to příznak NE.
Kam soubor .htaccess patří a co stojí
Soubor patří do kořenové složky webu a pravidla přesměrování dávejte nad blok, který si tam zapsal redakční systém. WordPress svoji sekci ohraničuje komentáři BEGIN WordPress a END WordPress a při aktualizaci ji přepisuje, takže cokoli uvnitř se může ztratit.
Za pohodlí .htaccess se platí výkonem. Podle dokumentace Apache se soubor načítá při každém požadavku a server ho navíc hledá i ve všech nadřazených složkách, takže režie vzniká i na webu, který žádný .htaccess nemá. Pokud máte přístup ke konfiguraci virtuálního hostu, patří pravidla tam. Na běžném sdíleném hostingu ale volbu nemáte a pro pár přesměrování je rozdíl zanedbatelný.
Časté otázky
Jak přesměrovat jednu URL na jinou?
Vyberte v generátoru typ „jedna URL“, zadejte původní cestu a cílovou adresu a vložte vygenerovaný blok do .htaccess. Pokud má pravidlo platit jen na té jedné adrese a ne na všem pod ní, použijte mod_rewrite, protože direktiva Redirect přesměruje i podřízené cesty.
Jak přesměrovat celou doménu na jinou?
Zvolte typ „celá doména“ a zadejte novou adresu. Pravidlo zachová cestu, takže stara.cz/blog/clanek skončí na nova.cz/blog/clanek. Pokud na serveru běží víc domén a přesměrování má platit jen pro jednu, vyplňte i původní domény a nechte mod_rewrite, protože mod_alias podmínku na doménu neumí.
Jak přesměrovat www na verzi bez www?
Vyberte typ „www“ a směr, kterým chcete adresy sjednotit. Vygenerované pravidlo pracuje s proměnnou hostitele, takže ho nemusíte upravovat a funguje na jakékoli doméně. Cílem je vždy adresa s HTTPS, takže jedno pravidlo vyřeší obojí.
Jak vynutit HTTPS pro celý web?
Použijte typ „HTTP na HTTPS“. Pokud web běží za proxy nebo za CDN, zaškrtněte odpovídající volbu, protože v takovém případě server o šifrovaném spojení neví přímo a podmínka se musí zjišťovat z hlavičky X-Forwarded-Proto. Bez toho by pravidlo skončilo v nekonečné smyčce.
Můžu přesměrovat i chybové stránky 404?
Generátor pravidla pro chybové stavy nevytváří. Vlastní chybová stránka se v Apache nastavuje direktivou ErrorDocument, ne přesměrováním. Hromadné přesměrování neexistujících adres na úvodní stránku se navíc nedoporučuje, protože vyhledávači tvrdí, že obsah existuje, i když neexistuje.