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.
Spis treści w artykule
- 1 Apache2 i .htaccess
- 2 Przekierowanie za pomocą .htaccess
- 2.1 Przekierowanie www.domena na domena
- 2.2 Przekierowanie całego ruchu na inną domenę
- 2.3 Przekierowanie pojedynczego adresu URL
- 2.4 Przekierowanie „po slashu” (/)
- 2.5 Przekierowanie/zmiana typu pliku
- 2.6 Kilka domen, jeden katalog Apache2 – jedna główna domena
- 2.7 Przerwa techniczna
- 2.8 Pracujemy nad nową wersją strony, a inni widzą starą wersję
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.
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01