Plik htaccess może zrobić całkiem niezłą pracę, jeżeli chodzi o poprawę bezpieczeństwa witryny oraz SEO dla strony internetowej. Może spowodować poprawę pozycji w wyszukiwarkach, ale i totalnie je zniszczyć. Jak na tak mały pliczek, może zrobić wiele brudnej roboty. Oczywiście głównie dla tych, którzy trzymają swoje witryny na serwerach Apache.
Poniżej znajdziesz kilka sztuczek na poprawę bezpieczeństwa witryny oraz SEO dzięki plikowi htaccess.
Zanim zaczniesz zmieniać swój htaccess…
Przed dokonaniem jakichkolwiek zmian w tym pliku, należy zrobić jego kopię zapasową i mieć go pod ręką na wszelki wypadek. Nie należy bać się pracy z htaccess, jednakże trzeba pamiętać, aby nie popełniać błędów w składni językowej. Ponadto wszystko, co jest napisane po „#” jest tylko komentarzem. Jeżeli zapomnisz dodać średnika przy zmianie czegoś w CSS, Twoja strona najwyżej będzie wyglądać kiepsko. Przy pomyłce w pliku htaccess serwer zwróci błąd 500 – Internal Server Error i jeżeli do tego dojdzie, to Twoja witryna przestanie działać. Nie panikuj, przecież zrobiłeś kopię bezpieczeństwa… Prawda? Po prostu przywróć stary htaccess.
Co to jest htaccess?
Plik htaccess ma całe mnóstwo zastosowań. Niektóre są bardzo ważne, a inne mniej. Jego zadaniem jest komunikacja z serwerem i przekazywanie pewnych wskazówek odnośnie do tego, co serwer ma zrobić, gdy internauci odwiedzają Twoją stronę internetową.
Jak stworzyć plik htaccess?
Jeżeli dopiero zaczynasz i nie masz jeszcze pliku htaccess, musisz go stworzyć, a jest dość proste. Kiedy otworzysz katalog, gdzie mieszczą się wszystkie pliki Twojej strony internetowej:
Stwórz zwykły plik o rozszerzeniu .htaccess. Do jego edycji możesz użyć zwykłego notatnika, ale w tym miejscu sugeruję Ci, abyś pobrał Notepad++, ponieważ dzięki niemu edycja pliku, który ma poprawić sprawy bezpieczeństwa witryny oraz SEO, będzie znacznie prostsza. Wklej poniższy kod:
<Files .htaccess>
order allow,deny
deny from all
</Files>
Options All -Indexes
Jest to najbardziej podstawowy przykład pliku .htaccess, będzie nam potrzebny tylko na początek. Powyższy kod wykonuje następujące działania:
- Zabezpiecza plik .htaccess przed podglądem z zewnątrz.
- Zakazuje listowania plików w folderze, gdzie leży Twoja strona internetowa.
Przykłady htaccess, które wpływają na poprawę bezpieczeństwa witryny oraz SEO:
1. Rozwiązywanie problemu z kanonicznymi adresami URL za pomocą htaccess.
Pierwszym problemem, z którym będziesz chciał się uporać, są kanoniczne adresy URL. Co to są kanoniczne adresy i dlaczego należy je stosować? Tutaj odsyłam do artykułu Google.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domena\.com$ [NC]
RewriteRule ^(.*)$ http://domena.com/$1 [R=301,L]
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://domena.com/$1 [R=301,L]
Powyższy kod przedstawia sytuację, gdy chcesz przekierować użytkowników z www.domena.com na domena.com. Ponadto plik htaccess przekieruje wszystkie strony index.html (jeżeli występuje u Ciebie index.php, to musisz zmodyfikować odpowiednio powyższy kod) na poprawny adres kanoniczny. Na pierwszy rzut oka, wydaje się, że nie ma to nic wspólnego z SEO, gdy używamy strony z www czy bez. Jednakże musisz pamiętać o tym, że witryna z www i witryna bez www, to dwie różne strony internetowe i musisz wybrać, której wersji będziesz używać. Dlaczego? Aby uniknąć duplikowania treść Twojej witryny.
2. Kod htaccess, który tworzy czyste adresy URL.
Następną rzeczą, którą należy wykonać za pomocą htaccess, jest stworzenie czystych adresów URL bez końcówek html lub php.
Porównaj oba adresy URL
http://domena.com/blog/jak-wybrać-nazwę-domeny.php
oraz
http://domena.com/blog/jak-wybrać-nazwę-domeny
Czysty URL oznacza brak rozszerzenia strony internetowej. Jak to zrobić?
RewriteBase /
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
Ten kod będzie działał również dla PHP (powinien; zależy to od serwera – sprawdź jego działanie i jeżeli nie będzie ucinało końcówek php, odpowiednio zmodyfikuj kod). Działanie kodu jest proste, ucina wszystkie końcówki .html.
WAŻNE! Aby kod powyższy kod odpowiednio działał, trzeba usunąć rozszerzenia .php lub .html w kodzie strony:
<a href="/podstrona.html">...</a>
zmieniamy na:
<a href="/podstrona">...</a>
3. Jak pozbyć się ukośnika z adresu URL przy użyciu htaccess?
Po dodaniu kodu na czyste URL-e okaże się, że niektóre strony miały na końcu ukośnik, a inne nie. Adres z ukośnikiem oznacza katalog, a bez – zwykły plik. W większości przypadków obie wersje tych adresów URL będą miały taką samą treść, co może być problematyczne dla wyszukiwarek. Taka błahostka, jak „/” może spowodować pojawienie się duplikatów strony, co nie jest dobrą rzeczą. Poniżej znajduje się kod, który upora się z tymi nieszczęsnymi ukośnikami:
RewriteEngine On
RewriteRule ^(.*)/$ http://%{HTTP_HOST}/$1
4. Kod htaccess dla kompresji GZIP.
GZIP to program, który służy do bezstratnej kompresji danych. Dzięki niemu nasza strona internetowa będzie ładować się o wiele szybciej. Jak to zrobić? Plik htaccess przychodzi znowu z pomocą. Niektóre serwery mają odgórnie nałożoną kompresję GZIP i nie potrzebujemy do tego żadnego nowego kodu. Sprawdzić to możesz na stronie Gift of Speed. Jeżeli odpowiedź jest negatywna, to musisz skorzystać z dobrodziejstw htaccess:
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>
Powyższy kod kompresuje pliki HTML, CSS, JavaScript, PHP itd.
5. Jak skonfigurować cache przeglądarki za pomocą htaccess?
Następnym krokiem na rzecz poprawy bezpieczeństwa witryny oraz SEO jest przetestowanie witryny przez Google PageSpeed Insights lub Pingdom Website Speed Test. Owe narzędzia sprawdzą szybkość Twojej strony internetowej i sporządzą odpowiedni raport. Możliwe, że zaproponują Ci wykorzystanie cache przeglądarki, aby zmniejszyć czas ładowania strony, umożliwiając pobranie odpowiednich plików do pamięci podręcznej (cache) przeglądarki. Po co to wszytko? Przeglądarka sama pobierze wszystko i będzie używać plików przez określony czas, zamiast pobierać je za każdym razem, gdy internauci będą odwiedzać Twoją stronę internetową. Jak już pewnie się domyślasz, możesz to ustawić wykorzystując htaccess:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
ExpiresByType text/cache-manifest "access plus 0 seconds"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType image/x-icon "access plus 1 week"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType text/x-component "access plus 1 month"
ExpiresByType font/truetype "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
<IfModule mod_headers.c>
Header append Cache-Control "public"
</IfModule>
</IfModule>
6. Protokół HTTPS tylko dla poszczególnych podstron witryny, używając htaccess.
Rozważmy następujący przykład. Mamy tylko jedną podstronę, która wymaga protokołu HTTPS. Używając htaccess, możemy osiągnąć to w prosty sposób. Spójrz na poniższy kod:
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/secure/(.*)$ [NC]
RewriteRule ^(.*)$ https://domena.pl/$1 [R=301,L]
Spowoduje to przepisanie adresu:
http://domena.com/formularz-logowania
Na adres URL z HTTPS:
https://domena.com/formularz-logowania
7. Łączenie RewriteCond w htaccess.
Na pewno zdarzy się tak, że będziesz musiał stworzyć przekierowania kilku podstron na jedną. Z htaccess, jak zwykle, jest to bułka z masłem:
RewriteCond %{REQUEST_URI} ^/podstrona-1 [OR]
RewriteCond %{REQUEST_URI} ^/podstrona-2 [NC]
RewriteRule ^(.*)$ http://domena.com/podstrona-3 [R=301,L]
W tym przypadku wejście na podstrony 1 i 2 będzie skutkowało natychmiastowym przekierowaniem na podstronę 3. O co chodzi z tymi wszystkimi przekierowaniami? Już wyjaśniam.
8. Przekierowania 301 w htaccess:
Powszechnie wiadomo, że przekierowania 301 są niezbędne dla odzyskania siły z nieistniejących już linków. Zdarza się to bardzo często przy migracji strony internetowej na inną domenę lub zmiany systemu CMS, który ma inną strukturę generowania linków. W ten sposób tworzymy sobie setki błędów 404. Jak temu zapobiec? Dzięki przekierowaniom 301.
Przekierowanie 301 całej domeny
Jeżeli chcesz przenieść całą stronę na inną domenę, musisz użyć przekierowania 301 całej domeny:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.domena.com$ [NC]
RewriteRule ^(.*)$ http://www.nowa-domena.com/$1 [R=301,L]
</IfModule>
Powyższy kod przekieruje:
http://www.domena.com/strona
Na nową domenę:
http://www.nowa-domena.com/strona
Przekierowanie 301 pojedynczej podstrony
Redirect 301 /strona http://domena.com/strona
RedirectMatch 301
RedirectMatch 301 różni się odrobinę od Redirect 301. Używając go z głową, możesz przekierować wiele adresów URL pisząc tylko jedną linijkę kodu. Przykład:
RedirectMatch 301 /buty-(.*).html /kategoria/buty-$1.html
Powyższy kod przekieruje:
http://www.domena.com/buty-nike-shox.html
Na:
http://www.domena.com/kategoria/buty-nike-shox.html
Użyliśmy wyrażenia regularnego (.*), aby opisać to, co jest po buty- oraz przed .html, co sprawia, że wszystkie strony pomiędzy buty- a .html będą przekierowane do folderu kategoria bez naruszenia ich nazw. W ten sposób, dodając tylko jedną linijkę kodu do naszego htaccess, uporaliśmy się z przekierowaniami 301 dla wszystkich starych podstron o nazwie buty-XYZ.html.
9. Ustawienie własnej strony błędów 404 w htaccess.
Dzięki htaccess można stworzyć niestandardowe strony błędów. Przykład:
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 500 /error.php
10. Ustawienie parametru charset za pomocą htaccess.
Możesz dodać parametr charset do witryny w pliku htaccess i usunąć kod ze strony internetowej. Dzięki temu zmniejszysz ilość zapytań HTTP, co przyspieszy delikatnie Twoją stronę:
AddCharset UTF-8 .html
11. Bezpieczeństwo Twojego htaccess.
Ten fragment kodu służy do zabezpieczenia odczytu pliku .htaccess. Blokuje dostęp, więc nikt z zewnątrz nie będzie mógł go odczytać, edytować, ani pobierać.
<Files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
satisfy all
</Files>
12. Zaznaczenie lokalizacji robots.txt w htaccess.
Pomóż botom w odnalezieniu robots.txt. Na pierwszy rzut oka, może się to nie wydawać problemowe, ale niestety głupie boty i złośliwe skrypty lubią skanować całą stronę w poszukiwaniu robots.txt. Na szczęście jest htaccess i odpowiedni kod, aby uporać się z tym:
<IfModule mod_rewrite.c>
RewriteBase /
RewriteCond %{REQUEST_URI} !^/robots.txt$ [NC]
RewriteCond %{REQUEST_URI} robots\.txt [NC]
RewriteRule .* http://domena.com/robots.txt [R=301,L]
</IfModule>
Powyższy kod przekierowuje wszystkie zapytania dotyczące robots.txt tylko do jednego pliku. Jeżeli nie chcesz używać RewriteCond, możesz wykonać to samo za pomocą przekierowania 301:
RedirectMatch 301 ^/(.*)/robots\.txt http://domena.com/robots.txt
13. Zaznaczenie lokalizacji mapy strony w htaccess.
Czasami zdarza się tak, że boty pomimo jasnego zdeklarowania w robots.txt mapy strony, nie mogą jej odnaleźć i błędnie wnioskują, że nasza strona nie posiada żadnej mapy strony. Wpływa to negatywnie na poziom bezpieczeństwa witryny oraz SEO. Aby wyeliminować takie działanie, pomóż robotom odnaleźć mapę witryny. Do tego użyjmy ponownie pliku htaccess:
<IfModule mod_alias.c>
RedirectMatch 301 /sitemap\.xml$ http://domena.com/sitemap.xml
RedirectMatch 301 /sitemap\.xml\.gz$ http://domena.com/sitemap.xml.gz
</IfModule>
Pierwsza reguła przekierowuje wszystkie żądania do nieskompresowanej mapy strony, zaś druga do skompresowanej wersji mapy strony.
14. Zaznaczenie lokalizacji favicons w htaccess.
Awatary, gravatary i favicony są wielkim hitem wśród skanerów stron internetowych. Złośliwy kod przeczesuje całą strukturę witryny w ich poszukiwaniu. Możemy to powstrzymać w pliku robots.txt, ale to nie zawsze działa. Działać za to będzie odpowiedni kod w htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/favicon.ico$ [NC]
RewriteCond %{REQUEST_URI} /favicon(s)?\.?(gif|ico|jpe?g?|png)?$ [NC]
RewriteRule (.*) http://domena.com/favicon.ico [R=301,L]
</IfModule>
Poprawa bezpieczeństwa witryny oraz SEO dzięki htaccess – podsumowanie
Z plikiem htaccess możesz w krótkim czasie sprawić, że poprawa bezpieczeństwa witryny oraz SEO będzie znacznie prostsza, niż Ci się wydaje na samym początku. Wiem, że napisałem sporo informacji na ten temat i może być to na pierwszy rzut oka bardzo kłopotliwe. Wiem również, że po przeczytaniu mojego wpisu dojdziesz do wniosku, że ten mały pliczek potrafi wykonać ogromną pracę na rzecz bezpieczeństwa witryny oraz SEO. Dlatego ta podstawowa wiedza, którą Ci przekazałem, może w przyszłości bardzo ułatwić Ci życie.
Bardzo dobry wpis. Dziękuję.
Witam a jak zrobić przekierowanie HTTPS np jak ma google /
https://google.pl -> https://www.google.pl
Krzysztofie, wypróbuj to:
RewriteCond %{HTTP_HOST} !^www.
RewriteCond %{HTTPS}s on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Ważne: musi być na samym początku wśród linijek odpowiadających za przekierowania, jeżeli używasz jeszcze jakichś dodatkowych.
Witam jak ustawić długość ” pamięci podręcznej na stronie-pliku blad-404.html
Sprawdzanie seo wyświetla ten czas na 1sek – dobrze?
Nie do końca rozumiemy, w czym problem. Jeżeli jakiś tester wykazuje już zdefiniowany czas (1 sekundę), to co chciałby Pan uzyskać? Czy chce Pan wydłużyć ten czas?
W wynikach walidacji seo jest zaznaczony ten błąd. Czy można wydłużyć ten czas choćby o 2dni ?
I druga kwestia – jeżeli można : czy przy pomocy pliku .htaccess zrobić przekierowanie adresu IP na domenę?
Można wydłużyć czas przetrzymywania w pamięci dowolnych typów treści – wystarczy zmienić dla odpowiedniego typu (w tym przypadku HTML) np. „access plus 1 week” na „access plus 1 month”, aby zmienić ten czas z jednego tygodnia na jeden miesiąc.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^12.34.56.789$
RewriteRule ^(.*)$ http://www.nazwadomeny.pl/$1 [L,R=301]
Z kolei ww. kod realizuje przekierowanie IP na domenę.
Super jasny i klarowny artykuł. Dużo najważniejszych i formacji w pigulce. Dziekuje.
Witam, mam takie pytanie odnośnie przepisywania adresów i ich przekierowania żeby nie było duplikowania treści. Przykładowo po przepisaniu adresu mam stronę „http://przykladowa-strona/kontakt” i taka jest w hiperłączach na stronie ale też pozostaje przecież strona oryginalna „http://przykladowa-strona/kontakt.php” i co wtedy? Czy to nie będzie wtedy duplikacja treści? Czy może wtedy trzeba oprócz przepisania adresu „kontakt.php” na „kontakt” dodatkowo zrobić jeszcze przekierowanie 301 „kontakt.php” na „kontakt”. Tylko wtedy pojawia się błąd: pętla przekierowań. Czy jest jakiejś rozwiązanie tego problemu? I jak to jest z tym slashem na końcu, czy nie odchodzi się od tego znaku na końcu, bo to dodatkowy znak i w sumie daje mylne wrażenie że to katalog?
Oczywiście adresy URL muszą być możliwie najkrótsze, zatem pozbywanie się wszelkich dodatków np. w postaci „.php” jest mocno wskazane. Do tego należy dopisać odpowiednie reguły w .htaccess, które automatycznie będą usuwały „końcówki”. W kwestii znaczka „/” na końcu, nie jesteśmy jego zwolennikami. Wyjątek – przynajmniej u siebie – stosujemy dla podstron zbiorczych typu /blog/ czy też adresy kategorii, jako wskazanie, że poniżej tych adresów znajdują się jeszcze bardziej szczegółowe (a konkretniej – wpisy blogowe).
Przydatna wiedza. Dzięki !