Generátor .htaccess přesměrování: 301 redirect pro Apache

Vygenerujte pravidla pro .htaccess: přesměrování URL, celé domény, www i HTTPS. Ke každému pravidlu dostanete komentář a upozornění na časté chyby.

Podle typu se změní pole níž i podoba vygenerovaného pravidla.

Kód přesměrování

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.

Direktiva

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.

Směr

Pravidlo si doménu odvodí z požadavku, takže ho nemusíte upravovat.

Lomítko na konci

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.

mod_alias — potřebný modul Apache·0 řádků

Jak generátor přesměrování použít

  1. 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.
  2. Zvolte kód přesměrování. Trvalé 301 pro definitivní přesun, dočasné 302, když se adresa zase vrátí.
  3. Doplňte zdrojovou a cílovou adresu. Speciální znaky se do regulárního výrazu ošetří samy.
  4. U pravidel, kde je volba na místě, se rozhodněte mezi mod_alias a mod_rewrite. Rozdíl je popsaný níže.
  5. 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ódVýznamMetoda požadavkuUkládá se do cache
301Trvale přesunutoPOST se může změnit na GETAno, i bez pokynu serveru
302Nalezeno, dočasněPOST se může změnit na GETNe
307Dočasné přesměrováníMetoda zůstává zachovanáNe
308Trvalé 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.