O pliku .htaccess już kilkukrotnie pisałem, bo ten- mogłoby się wydawać – niepozorny plik kryje wielkie możliwości.

W tym wpisie postaram się przedstawić kilka przykładów (scenariuszy) wykorzystania pliku .htaccess do przekierowania ruchu z jednej strony na inna, z jednego adresu na inny.

Apache2 i .htaccess

Jeśli korzystacie z hostingu współdzielonego to najprawdopodobniej serwer to Apache2, i pewnie macie aktywna obsługę plików .htaccess, a tym samym wszystko powinno działać zaraz po zakupie/aktywacji konta.

Jeśli korzystacie z własnego serwera może być konieczna aktywacja obsługi plików .htaccess – oczywiście jeśli jako oprogramowanie serwera wybraliście Apache2, a nie np. Enginx – gdzie nie ma obsługi plików .htaccess, choć są różne metody na obejście tego problemu…

Więcej o tym pisałem tutaj (konfiguracja serwera WWW), więc tylko w skrócie:

sudo a2enmod rewrite
sudo service apache2 restart

Przekierowanie za pomocą .htaccess

Oprócz przedstawienia podstawowych poleceń/komend/wpisów postaram się też oprzeć na  krótkich scenariuszach zadaniowych – czyli najpierw określamy cel a następnie działamy.

Mam nadzieję, że takie podejście do tego tematu będzie bardziej zrozumiałe niż „suchy tekst”.

ifModule

Jeszcze mała uwaga – w przykładach będę pomijał „ifModule” by nie komplikować przykładów. Nie jest to wymagane, ale powiedzmy, że dla zasady warto stosować.

Dlatego możecie podane przykłady (a przynajmniej większość) obudować wg wzoru:

<ifModule mod_rewrite.c>
 [KOD Z PRZYKŁADU]
</ifModule>

R=301, R=302, R=307

W przykładach będą się też pojawiać 3 kody przekierowań:

  • R=301 – przekierowanie trwałe/stałe
  • R=302 – przekierowanie tymczasowe
  • R=307 – przerwa techniczna

Przekierowanie www.domena na domena

Chyba najczęściej prze zemnie wykorzystywane przekierowanie, które kieruje cały ruch bezpośrednio na domenę, z pominięciem „subdomeny” www:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.webinsider.pl$
RewriteRule ^/?$ "http\:\/\/webinsider\.pl" [R=301,L]

Ten kod spowoduje przekierowanie każdego zapytania w postaci:

www.webinsider.pl/cokolwiek

na:

webinsider.pl/cokolwiek

Przekierowanie całego ruchu na inną domenę

By przekierować cały ruch z jednej domeny na inną – np. po zmianie adresu strony – wystarczy skorzystać z:

RewriteEngine On
RewriteRule ^(.*)$ http://nasza-nowa-domena.pl/$1 [R=301,L]

Przekierowanie pojedynczego adresu URL

Możemy też przekierować pojedynczy adres URL:

Redirect 301 /stary-adres-url.htm http://jakaś-domena.pl/nowy-adres-url.htm

A w raz z tym rodzajem przekierowania warto napisać o:

Przekierowanie „po slashu” (/)

Możemy ustawić przekierowanie „po slashu” dla naszej domeny:

Redirect 301 /poczta https://jakiś-serwer-pocztowy.pl/panel-poczty

Spowoduje to, że po wpisaniu adresu:

http://jakaś-nasza-domena.pl/poczta

zostaniemy przekierowani na stronę:

https://jakiś-serwer-pocztowy.pl/panel-poczty

Przekierowanie/zmiana typu pliku

RedirectMatch 301 (.*)\.html$ http://jakaś-nasza-domena.pl$1.php

I tym sposobem każde odwołanie do pliku HTML zostanie automatycznie zmienione na odwołanie do pliku PHP.

Podstawowe przykłady za nami, teraz kilka troszkę bardziej „skomplikowanych” scenariuszy:

Kilka domen, jeden katalog Apache2 – jedna główna domena

Załóżmy, że mamy kilka domena:

  • nazwa-naszej-firmy.pl
  • nazwa-naszej-firmy.com.pl
  • nazwa-naszej-firmy.eu

I wszystkie 3 domeny kierują do tego samego katalogu na naszym serwerze (Apache2), i tym samym wyświetlają tą samą stronę/zawartość, choć pod różnymi domenami.

I pewnie by tak mogło być, ale powiedzmy, że w ramach działań SEO (związanych z pozycjonowaniem strony) zapada decyzja by wszystkie domeny kierowały na główna, a przy okazji nie chcemy generować błędów 404 (nie znaleziono strony) jak ktoś skorzysta z linka do produktu/strony z jedną z alternatywnych domen.

W tym celu korzystamy z wpisu:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^nazwa-naszej-firmy.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.nazwa-naszej-firmy.com$ [OR]
RewriteCond %{HTTP_HOST} ^nazwa-naszej-firmy.com.pl$ [OR]
RewriteCond %{HTTP_HOST} ^www.nazwa-naszej-firmy.com.pl$ [OR]
RewriteCond %{HTTP_HOST} ^nazwa-naszej-firmy.eu$ [OR]
RewriteCond %{HTTP_HOST} ^www.nazwa-naszej-firmy.eu$ [OR]
RewriteCond %{HTTP_HOST} ^www.nazwa-naszej-firmy.pl$
RewriteRule (.*)$ http://nazwa-naszej-firmy.pl/$1 [R=301,L]

Tym sposobem wszystkie adresy z domen innych niż .pl zostaną skierowane na nazwa-naszej-firmy.pl, a przy okazji kierujemy ruch z www.nazwa-naszej-firmy.pl na nazwa-naszej-firmy.pl, więc mamy takie 2w1.

Przerwa techniczna

Kolejny scenariusz to przerwa techniczna – chcemy wykonać kilka operacji (mniejszych lub większych ;-)) na stronie, będziemy pracować z konkretnych adresów IP… Pozostałych odwiedzających przekierujemy na przygotowaną w tym celu stronę informacyjna („Przepraszamy, przerwa techniczna. Zapraszamy o…”)

RewriteEngine On
RewriteBase /
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123
RewriteCond %{REQUEST_URI} !^/przerwa-techniczna\.html$
RewriteRule ^(.*)$ http://jakaś-nasza-domena.pl/przerwa-techniczna.html [R=307,L]

Korzystamy tu z kilku „trików”:

Wykluczamy nasz adres IP z przekierowania, dzięki czemu sami będziemy mieli pełny dostęp do strony:

RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123

Zamiast 123\.123\.123\.123 wstawcie swój adres IP. Można wykluczyć kilka adresów kopiując (zwielokrotniając) tą linijkę dla każdego adresu IP.

Kolejny ważna linijka to:

RewriteCond %{REQUEST_URI} !^/przerwa-techniczna\.html$

Dzięki niej unikniemy pętli, czyli przekierowania po przekierowaniu… Dotyczy to przekierowania w ramach tej samej domeny/serwera.

Pracujemy nad nową wersją strony, a inni widzą starą wersję

Kolejny scenariusz – i zarazem jeden z powodów powstania tego wpisu – to sytuacja gdy mamy jakąś stronę, ale chcemy w sposób przezroczysty dla użytkowników przygotować nową stronę.

Dla jednego z klientów przygotowuje kilka stron internetowych – część jest nowa, więc wystarczy blokada .htaccess lub przekierowanie na „zaślepkę” (podobnie jak w opisywanej powyżej sytuacji dotyczącej przerwy technicznej).

Tam gdzie strona już działa – sprawa komplikuje się trochę bardziej, bo chcemy przez te „kilka dni” jeszcze utrzymać starą stronę aktywną, gdy w tym czasie szykujemy nową.

Oczywiście można by tu skorzystać ze środowiska testowego, czy subdomeny – ale uznajmy, że środowisko testowe to jednak środowisko testowe, i często po migracji do środowiska produkcyjnego coś będzie nie tak… A subdomena – niby może być w tym samym środowisku, ale po co komplikować sobie później życie… ;-)

Stara strona trafiła do katalogu „old” (oczywiście „old” to tylko nazwa katalogu na potrzeby tego wpisu), a w katalogu głównym powstaje w tym czasie nowa…

A całość – w sposób przezroczysty dla użytkowników – załatwia taki wpis w .htaccess:

RewriteEngine on
RewriteBase /
RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123
RewriteCond %{REQUEST_URI} !^/old/
RewriteRule ^(.*)$ /old/$1 [R=302,L]

Jak w sytuacji powyżej – tak i tym razem zamiast „123\.123\.123\.123” należy wstawić swój adres (lub adresy) IP, dzięki czemu sami nie będziemy przekierowywani… Do tego wykluczamy „pętle” dla już przekierowanych.

A gdy nowa strona będzie już gotowa – wystarczy usunąć te kilka linijek z .htaccess i po sprawie.

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk