31 Jul
![]()
.htaccess zaś to oczywiście plik konfiguracyjny serwera Apache (choć nie tylko on je interpretuje) pozwalający na zmianę konfiguracji serwera (o ile globalna konfiguracja serwera zezwala na stosowanie plików .htaccess). Działa tylko w katalogu (i jego podkatalogach), do którego wgramy plik .htaccess. Zwróćcie uwagę, że nazwa pliku zaczyna się od kropki – w systemach typu Linux oznacza to plik ukryty. Dzięki plikom .htaccess możemy ustawić wiele różnych parametrów takich jak np. przekierowania, własne strony błędów, blokady dostępu dla wybranych IP (albo dostęp tylko dla wybranych IP), autoryzację loginem i hasłem, przepisywanie linków i wiele innych.
Własne strony błędów
Strony błędów definiuje się tak:
ErrorDocument 400 /400.html
ErrorDocument 401 /401.html
ErrorDocument 403 /403.html
ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
ErrorDocument 503 /503.html
Oznacza to, że w razie wystąpienia błędu, dajmy na to, 404 (”nie ma takiej strony”) serwer wyświetli nam stronę 404.html znajdującą się w katalogu głównym serwera.
Można też od razu w pliku .htaccess wpisać kod HTML z komunikatem o błędzie (choć zalecam jednak stosowanie plików):
ErrorDocument 401 "Musisz <strong>być</strong> <a href="/login.php">zalogowany</a> aby móc obejrzeć tą stronę!"
Blokowanie dostępu
Aby zablokować np. upierdliwego internautę albo uciążliwą wyszukiwarkę/bota wystarczy wprowadzić w pliku .htaccess następujący wpis:
Deny from XXX.XXX.XXX.XXX
gdzie zamiast ciągu XXX.XXX.XXX.XXX należy wpisać adres IP, który chcemy zablokować.
Jeśli zaś chcemy ograniczyć dostęp do jakiegoś katalogu tylko dla wybranego IP (np. naszego domowego, tak aby nikt poza nami nie miał dostępu do plików) należy posłużyć się następującym zapisem:
Deny from all
Allow from XXX.XXX.XXX.XXX
gdzie pierwsza linijka powoduje całkowite zablokowanie dostępu, zaś druga dopuszcza dostęp z numeru XXX.XXX.XXX.XXX.
Blokować możemy pojedyncze numery IP lub całe bloki, np.
order allow,deny
deny from 123.45.6.7
deny from 012.34.5.
allow from all
Zwróćmy uwagę na pierwszą linijkę powyższego kodu – ustawia ona kolejność aplikowania reguł: najpierw zezwolenie (allow) a potem odrzucenie (deny). Dlatego pomimo, że zapis allow from all (który normalnie “skasowałby” występujące przed nim reguły deny) jest na końcu to jednak reguły deny zostaną zastosowane.
Zabezpieczanie dostępu do katalogu hasłem
Aby zabezpieczyć dostęp do katalogu hasłem musisz zrobić dwie rzeczy:
- stworzyć plik zawierający login (umówmy się, że będzie to tomek) i zaszyfrowane hasło (np. warszawa1), nazwać go .htpasswd i wgrać do katalogu niedostępnego z internetu (załóżmy, że będzie to /usr/local/twoj/bezpieczny/katalog/ i wpisać do niego następujący kod:
tomek:VhsmZRSciVEnA
- wprowadzić do pliku .htaccess poniższy wpis:
AuthUserFile /usr/local/twoj/bezpieczny/katalog/.htpasswd
AuthGroupFile /dev/null
AuthName EnterPassword
AuthType Basicrequire user tomek
Aby wygenerować zaszyfrowane hasło możemy posłużyć się np. generatorem dostępnym tu albo tu.
Powyższy wpis spowoduje, że dostęp do wybranej części witryny będzie mógł uzyskać tylko użytkownik tomek po podaniu poprawnego hasła.
Blokowanie wyświetlania zawartości katalogu
Czasem zdarza się, że w jakimś katalogu nie ma pliku index.html. Wtedy domyślnie serwer wyświetla zawartość tego katalogu. Aby temu zapobiec należy wprowadzić następujący wpis:
Options -Indexes
albo tak:
IndexIgnore *
Gwiazdka (tzw. dzika karta) oznacza wszystkie pliki. Możemy też np. zablokować wyświetlanie tylko określonych plików, np. obrazków:
IndexIgnore *.jpg *.gif *.png
Jeśli zaś mamy domyślnie zablokowane wyświetlanie zawartości katalogów to możemy je włączyć używając takiego wpisu:
Options +Indexes
A jeśli chcemy być naprawdę sprytni to możemy jeszcze dołożyć opis zawartości katalogu (lub inną wiadomość) poprzez wgranie do interesującego nas katalogu jednego (lub obydwu) z plików: HEADER (zostanie wyświetlony na początku, przed listą plików) oraz README (zostanie wyświetlony jako stopka, po liście plików.
Przekierowania
Przy użyciu pliku .htaccess możemy tworzyć przekierowania wywołań do zupełnie innego pliku lub nawet do innej witryny. Można dzięki temu np. zmienić nazwę pliku na nową, ale jednocześnie zachować stare odwołanie do strony. Można też np. po prostu poskracać dzięki temu linki do wybranych stron. Przykład:
Redirect /sciezka/od/katalogu/glownego/plik.htm http://www.zupelnieinnawitryna.pl/nowa/lokalizacja/plik.php
Można też ustawić przekierowanie dla całych katalogów, np. jeśli masz katalog o nazwie starykatalog na starej witrynie i chcesz dać do niego dostęp z nowej witryny: http://www.nowawitryna.pl/nowykatalog/. W tym celu należy posłużyć się następującym wpisem:
Redirect /starykatalog http://www.nowawitryna.pl/nowykatalog
Efekt jest taki, że kiedy ktoś wywołuje plik znajdujący się poniżej katalogu /starykatalog to zostanie przekierowany na nową witrynę a w linku znajdą się wszystkie dodatkowe informacje potrzebne do prawidłowego przekierowania, np. jeśli ktoś wywołuje plik:
http://www.starawitryna.pl/starykatalog/starepliki/images/image.gif
to zostanie przekierowany do:
http://www.nowawitryna.pl/nowykatalog/starepliki/images/image.gif
Blokowanie użytkowników/witryn wg pochodzenia
Wyobraź sobie sytuację: sprawdzasz logi serwera i okazuje się, że Twoja witryna ma dużą odwiedzalność – duży ruch przychodzący z jednej witryny. Zaglądasz na tą witrynę, ale nigdzie nie możesz znaleźć linku prowadzącego do twojej. Wniosek: najprawdopodobniej witryna ta stosuje tzw. hotlinking, czyli wykorzystuje pliki z twojej strony (np. zdjęcia albo arkusze stylów) na swojej. Jest to praktyka naganna, ale niestety zdarza się. Ale na szczęście dzięki plikom .htaccess możemy się przed tym bronić.
Co jest nam potrzebne? Poza samym plikiem .htaccess musimy mieć jeszcze zainstalowany moduł serwera Apache o nazwie mod_rewrite abyśmy mogli wykrywać pochodzenie ruchu.
Blokowanie ruchu z pojedynczego serwera:
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} bandyta\.pl [NC]
RewriteRule .* - [F]
Blokowanie ruchu z wielu serwerów:
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} bandyta\.pl [NC,OR]
RewriteCond %{HTTP_REFERER} kolejnybandyta\.pl
RewriteRule .* - [F]
Zauważmy, że nazwa domeny bandyta\.pl zapisana jest z backslashem przed kropką. Backslash jest znakiem ucieczkowym i musimy go zastosować przed kropką ponieważ stosujemy tu wyrażenie regularne a kropka w wyrażeniach regularnych oznacza “dowolny znak”. Nam nie chodzi o “dowolny znak” tylko właśnie o kropkę i dlatego musimy użyć backslasha, aby Apache zrozumiał, że chodzi nam o kropkę. Flaga [NC] dodana na końcu nazwy domeny oznacza, że serwer Apache ma interpretować ten zapis niezwracając uwagi na wielkość liter, tak więc czy odwołanie nastąpi z bandyta.pl czy Bandyta.pl – zostanie zablokowane. Ostatnia linijka oznacza, że zamiast wyświetlenia żądanego zasobu zostanie zwrócony błąd 403. Cała różnica pomiędzy blokowaniem pojedynczego serwera a blokowaniem wielu serwerów polega na zmianie flagi z [NC] na [NC, OR] w przypadku każdej kolejnej domeny Z WYJĄTKIEM OSTATNIEJ NA LIŚCIE.
W obydwu przypadkach mamy też linijkę Options +FollowSymlinks, która jest zakomentowana (znak # na początku linijki oznacza komentarz – linijka ta nie jest wtedy interpretowana przez serwer Apache). Odkomentuj ją jeśłi twój serwer Apache nie jest skonfigurowany z FollowSymLinks w sekcji <directory></directory> w pliku httpd.conf. Poznasz to po tym, że serwer zwraca błąd 500 Internal Server error podczas próby użycia powyższego kodu.
No, to by było na tyle, jeśli chodzi o część pierwszą. Postaram się w najbliższych dniach napisać ciąg dalszy a w nim:
.htaccess,.htaccess,Osobny wpis poświęcę też na opisanie przepisywania linków przy pomocy mod_rewrite.
27 odpowiedzi for ".htaccess – podstawy (część I)"
niezły artykulik :)
z mod_rewritem mam od zawsze problemy i takie tutki bardzo sie przydają :D
thx
Przydatne… chętnie przeczytam część II i III :)
Pozdrawiam.
no zobaczymy czy zadziała :)
u mnie nie działa
w pliku httpd.conf napisałem
AccessFileName htaccess.conf
Tworzę plik htaccess.conf w katalogu który jest umieszczony w katalogu users głównego katalogu apache w tym pliku wpisuje
AllowOverride All
Order deny,allow
Allow from 192.168.35.2
Deny from all
znak / po słowie Directory jak sie domyślam to jest bieżący katalog, można tam ustawiać sciężkę do którego katalogu ma być używane aktualne ustawienie między słowami Directory
a wygląda to coś w tym rodzaju
“C:/Program Files/Apache Group/Apache2/user/home”
no i co dalej, nie zauważyłem tutaj jakieś podstawowej konfiguracj do używania pliku htaccess.
Jak ktoś coś wie, to będę wdzięczny za podpowiedź
.
.
widze że znikły słowa Directory które powino być w przed słowem AllowOverride z znakiem / oznaczającym jak wyżej opisałem i po Deny from all z zamknięciem znak / przed słowem Directory
//
.
Bardzo przydatne. Zrozumiale napisane, łatwo przysfajalne :)
Witam!
Bardzo te informacje nam się przydały szczgólnie jesli chodzi o hotlinkowanie obrazków.
Dziękujemy
dzieki wielkie za artykulik, bardzosie przydal ;)
No włąśnie męczę się żeby porobić przekierowanie i żeby zawsze strona wyświetlała się zawsze z www.
Fajny artykulik
mam ok 30 katalogów w kat. głównym. W momencie kiedy wpisuję np. http://www.xyz.pl/katalog/ wyświetla mi listing zawartości a chcialbym, żeby nie było nic widoczne. redirect działa i jest ok do momentu kiedy w /katalog/nie-ma-podkatalogu/. Jesli ktoś grzebie w en sposób to zawsze trafi jakąś ścieżkę, gdzie wyświetli zawartość. Chcialbym tego uniknąć bez kopiowania przykładowego indeksu z redirect’em do każdego katalogu i jego podkatalogów. Ktoś ma jakiś pomysł?!
Dzięki za wszelkie info!!!
W tekście powyżej masz to opisane. Albo w .htaccess (wrzucasz do katalogu głównego), albo w httpd.conf (dla określonego katalogu, może być globalnie dla całego serwera) wrzucasz to:
Options -Indexes
i zawartość katalogów nie będzie listowana – serwer zwróci 403 – access denied. Chyba, że wgrasz plik index.html (albo index.php) – to wtedy wyświetli Ci ten plik.
Ok. moja nie uwaga. Hula wszystko tak jak chciałem, ale ustawienia htaccessa nic nie wniosły tylko httpd.conf’a.
Czy możesz mnie oświecić jeszcze a propos przekierowania?
Nie chcę tego komunikatu “forbbiden” wolałbym przekierowanie na stronę główną. Grzebałem w pliku HTTP_FORBBIDEN.html.VAR, ale niestety nic. czy mam coś zmieniać z f. include?? Mozesz pomóc??
Żeby .htaccess zadziałał to musisz odpowiednio skonfigurować Apache’a.
Przekierowania – użyj mod_rewrite, trochę o tym jest tu: http://www.webowe.pl/htaccess-podstawy-czesc-ii/ a więcej na Google’u.
Co masz na myśli pisząc “f.include”?
funckcja include w pliku HTTP_FORBIDDEN.html.var z katalogu error
Miałem na myśli funkcję include w pliku HTTP_FORBIDDEN.html.VAR odpowiadającym za błąd (jak wszystkim wiadomo) 403. Ale niepotrzebnie się zagalopowałem i znowu przez nie uwagę! W sumie najprostsze rozwiązania są najlepsze więc zrobiłem też przekierowania i też bez htaccess’a.
W pliku httpd.conf, aby zablokować wyświetlanie zawartości katalogu bez pliku index.* wystarczyło (jak pisałeś wyżej) w pewnej dyrektywie dopisać minus (-): Options -Indexes FollowSymLinks i w ten sposób zablokować listing katalogów.
Natomiast przekierowanie zrobiłem jeszcze w bardziej banalny sposób, otóż korzystając z errorDocument zdefiniowałem błąd 403 po swojemu tj.: ErrorDocument 403 http://localhost/
Wszystko śmiga, ale i tak pobawię się z .htaacess i modułami, na wypadek gdybym miał udostępniać komuś zawartość katalogu na hasło. Dzięki za wszelkie INFO! pzdr!!!
Dzięki, właśnie mi artykuł pomógł. Miałem zbyt dużą oglądalność jednej ze stron ;). Przekierowanie ładnie stworzone ;)
A jak zrobić zabezpieczenie, że np jak ktoś wpisze w adresie np:
http://jakisadres.pl/scripts/
To, żeby jak wejdzie normalnie w tą stronę, blokowało mu, że nie ma dostępu do niej, a w trakcie używania innej podstrony, do której ma dostęp, a jest zaincludowany plik z /scripts/ to żeby wtedy dawało dostęp?
Ale skoro jesteś na innej stronie to po co Ci dostęp do /scripts/ ? Przypuszczam, że chodzi Ci o to żeby internauci nie mieli dostępu do /scripts/ a PHP żeby mogło stamtąd includować pliki. Jeśli tak to:
jeśli zablokujesz INTERNAUTOM dostęp do katalogu /scripts/ przy pomocy pliku .htaccess zawierającego polecenie deny from all to blokujesz dostęp INTERNAUTOM a nie interpreterowi PHP. W ten sposób często zabezpiecza się katalogi z tzw. include’ami albo z szablonami…
nie wiem co robie źle ale zrobilem tak jak napisal karlo i dalej mi wyswietla katalogi ;/ help me…
Przeczytaj komentarz numer 11…
przeczytalem i znalazlem linie:
Options Indexes FollowSymLink i zmienilem na
Options -Indexes FollowSymLink, i to nic nie dalo, wiec zmienilem na Options -Indexes i dlaej to samo, wiec co robie źle ?
W jakim pliku i w którym miejscu tego pliku to robisz? W której sekcji? Najlepiej podaj fragment.
Restartujesz potem serwer?
zmienam to w pliku httpd.conf a fragment to:
# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the “default” to be a very restrictive set of
# features.
#
Options -Indexes
To nie może być sobie wklepane byle gdzie tylko pomiędzy znacznikami <Directory>.
Zajrzyj tu:
http://www.webowe.pl/eleganckie-linki-seo-w-10-sekund/
Najlepiej wklepać to właśnie dla katalogu głównego serwera, np. na OpenBSD jest to katalog /var/www/htdocs. Zrób tak jak napisałem w tym poście to nie dość, że będziesz miał wyłączone listowanie zwartości folderów (dla wszystkich witryn) to jeszcze będziesz mógł korzystać z “przyjaznych linków SEO” (też dla wszystkich witryn na serwerze).
Aha, nie zapomnij zrestartować Apache’a po wprowadzeniu zmian do httpd.conf.
wlasnie tak zrobilem tylko nie iwem dlaczego nie przekleilo mie znacznika i sie nie wyswietla ;/ jak dasz mi namiar do siebie na gg to przesle caly httpd.conf lub odezwij sie bardzo prosze do mnie na gg 621005
wogule jest dziwna rzecz nawet jak daje miedzy znacznikami deny from i podaje ip kompa w sieci loklanej to sie wyswietla zawartosc katalogu. A z tego co przeczytalem to nie powinna
Komunikatorów nie używam, odezwę się na maila.
Zostaw odpowiedź
Musisz być zalogowany/zalogowana, aby móc wysłać komentarz.