search check home clock-o tag tags chevron-left chevron-right chevron-up chevron-down twitter facebook github rss comment comments terminal code

[htaccess] Zabawa z .htaccess – sposoby wykorzystania pliku .htaccess

Musiałem od nowa napisać ten artykuł na temat .htaccess, bowiem w wyniku małego wypadku związanego z bazą danych utraciłem artykuł.

Plik .htaccess jest bardzo ciekawym plikiem, bowiem jest on odpowiedzialny za konfigurację zachowania się serwera, to znaczy w nim możemy zdefiniować odpowiednie reguły dotyczące tworzenia przyjaznych linków czy tez blokowania do zasobów serwera osobom niepowołanym.

  1. Przyjazne linki

    Ten efekt jest możliwy do osiągnięcia tylko w przypadku działającego mod_rewrite na serwerach typu Apache.

    Jeśli witryna w której chcemy wykorzystać przyjazne linki ma skomplikowane adresy www poszczególnych stron, które wyglądają na przykład tak: www.twojastrona.pl/index.php?id=jakas.

    Taki wygląd linka na pewno nie jest dobrym pomysłem, jesli chcemy by Google dobrze zaindeksowało stronę pod takim linkiem.
    Możemy to zmienić za pomocą następującej reguły:

                    # inicjujemy rewrite engine
                    RewriteEngine on
                    # dla przykładu z www.twojastrona.pl/id/jakas/
                    RewriteRule ^strona/([^/.]+)/?$ index.php?id=$1 [L]
                    # dla przykładu z www.twojastrona.pl/jakas/
                    RewriteRule ^/([^/.]+)/?$ index.php?jakas=$1 [L]

  2. Znak "/" na końcu adresu URL

    Przepisując adresy za pomocą reguły podanej wyżej należy pamiętać o znakach "/" by wystąpiły na koncu adresu.

                	RewriteEngine on
    				# nie dodajemy nic jeśli żądany plik istnieje
                    RewriteCond %{REQUEST_FILENAME} !-f
                    # sprawdzamy czy dany URL nie ma slasha na końcu
                    RewriteCond %{REQUEST_URI} !(.*)/$
                    # jeśli nie ma, przepisujemy URL z przekierowaniem 301
                    RewriteRule ^(.*)$
                    http://%{HTTP_HOST}/$1/ [L,R=301]

    Należy pamiętać, aby dla celów testowych ustawić R=302 zamiast R=301. Dzięki temu przeglądarka wie, że taki adres jest tymczasowy i taki adres będzie sprawdzany za każdym razem przez przeglądarkę, czy ma taką postać. Inaczej ten adres byłby przyjęty jako ostateczny i mogłyby wystapić włęby w przekierowaniach na strony WWW.

  3. Przekierowanie adresów z www na bez www i na odwrót

    Wg Google, adresy www.twojastrona.pl i twojastrona.pl to dwie odrębne domeny, przez co musimy zadbać o to, aby obydwa adresy przekierowywały na tą samą stronę, a nie na dwie różne. Należy wybrać jeden typ adresu jako główny, a drugi przekierować na ten główny.

    Dzięki temu unikniemy też, tak zwanego, duplicate content.
    Do tego zabiegu służy następująca reguła:

                    RewriteEngine on
                    # przekierowanie dla przykładu www -> bez www
                    RewriteCond %{HTTP_HOST} ^www.twojastrona.pl$ [NC]
                    RewriteRule ^(.*)$ http://twojastrona.pl/$1 [R=301,L]
                    # przekierowanie dla przykładu bez www -> www
                    RewriteCond %{HTTP_HOST} !^www.
                    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

  4. Przekierowanie na nową domenę

    Za pomocą pliku .htaccess możemy przekierować użytkownika Internetu na nową domenę. Tutaj ważne jest to, aby struktura folderów strony na nowej domenie nie uległa zmianie.

                	RewriteEngine On
    				RewriteRule ^(.*)$ http://www.twojanowastrona.pl/$1 [R=301,L]

  5. Zabezpieczenie folderu przed listowaniem plików

    Z reguły w folderach powinno się dawać puste pliki.html, ale jesli nie możemy takowego pliku dać do folderu lub nie chcemy, to możemy wykorzystać poniższą regułę. Dzięki temu zabezpieczymy zasoby serwera przed przeglądaniem przez niepowołane osoby.

                	Options All -Indexes

  6. Własne strony błedów

    Czasem chcemy zmienić standardowe strony błędów na swoje własne, nawiązujące bardziej do naszej strony.

                	# dla błędu 404 - File not found (nie znaleziono pliku)
    				ErrorDocument 404 /404.html
                    # dla błędu 500 - Internal Server Error (wewnętrzny błąd serwera)
                    ErrorDocument 500 /500.html

    Inne strony błędów jakie możemy zdefniować to:

    • 400 ? Bad request (niepoprawne żądanie)
    • 401 ? Authorization Required (wymagana autoryzacja)
    • 403 ? Forbidden (dostęp zabroniony)
  7. Zabezpieczanie dostępu do folderów hasłem

    Jest to bardzo przydatna opcja. Szczególnie przydatna do zabezpieczania dostępu do zaplecza administracyjnego stron. Jako uzupełnienie zwykłego logowania opartego o bazy danych.
    Na serwerach typu Apache stosujemy następującą regułę w .htaccess:

                	AuthType basic
                    AuthName "Musisz się zalogować"
                    AuthUserFile /sciezka_bezwgledna_do_folderu_na_serwerze/.htpasswd
                    Require valid-user

    Natomiast na serwerach typu IdeaWebServer (home.pl korzysta z tego typu serwerów):

                	:Location /public_html/folder
                    AuthUserFile /sciezka_bezwgledna_do_folderu_na_serwerze/.htpasswd
    				Access allow all valid-user
    				:Location

    Dodatkowo należy stworzyć plik z hasłami, czyli .htpasswd i umieścić go w miejscu, które podaliśmy w AuthUserFile. Ten plik wygląda na przykład tak:

                	piotr:aDfk89sKl
    				nalepa:ws34dfFC

    Dodatkowo, istnieje możliwość udostępniania folderów wedle numeru IP. Reguła wygląda następująco:

                	AuthType basic
                    AuthName "Witryna wymaga autoryzacji"
                    AuthUserFile /sciezka_bezwgledna_do_folderu_na_serwerze/.htpasswd
                    AuthGroupFile /dev/null
                    Require valid-user
                    Deny from all
                    Allow from xxx.xxx.xx.xx
                    Satisfy Any

  • Piotrek

    Witam.

    Czy można zrobić za pomocą .htaccess taki myk 🙂
    Mam dwie domeny na jednym serwerze. Chciałbym żeby oba odwołania np. http://www.a.pl i http://www.b.pl ładowały stronę http://www.a.pl. Funkcjonalnie pozycja nr 4 niniejszego artykułu rozwiązuje problem. Jednak w polu adresu zawsze jest http://www.a.pl. Czy da się zrobić tak, że po wpisaniu http://www.b.pl przeglądarka wyświetli zawartość http://www.a.pl ale nie zmieni adresu na http://www.a.pl tylko w polu adresu dalej bedzie widać http://www.b.pl?

    Pozdr.
    Piotrek.

  • Witam,
    nie spotkałem się z tego typu zastosowaniem adresowania. Musiałbym się porozglądać za tego typu próbą rozwiązania problemu.
    Jednak na chwilę obecną wydaje mi się, że takie rozwiązanie raczej nie może mieć miejsca, lecz mogę się mylić.

  • Artur

    Witam mam problem z plikiem .htaccess chodzi o przyjazne lnki. cos nie tak mam w kodzie bo mi sie linki nie wyswietlaja

    sciezke mam taka:
    http://adres_strony/katalog/_tu dopiero_strona

    kod jest taki w .htaccess (czegos mi tu brakuje bo sie nie wyswietla podstrona):

    RewriteEngine On
    RewriteBase /

    RewriteRule index,(.+).html$ index.php?l=$1 [L] #index,pl.html
    RewriteRule index.html$ index.php [L] #index.html

    RewriteRule materialy,(.+).html$ materialy.php?kat=$1 [L] #materialy,kat.html

    za wszelka rade pomoc bede wdzieczny

  • Tutaj masz sposób dotyczący przekierowania na katalog /EN/ który kiedyś wykorzystałem

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (en)/ /index.php?lang=en [L,QSA]

    Teraz, żeby ładowały się skrypty js, css i grafiki, to potrzebny jest następujący wpis:

    RewriteRule ^.+(/img/.+)$ $1 [L]
    RewriteRule ^.+(/js/.+)$ $1 [L]
    RewriteRule ^.+(/style/.+)$ $1 [L]

  • Witam. Moje pytanie brzmi: Jaka tresc wpisac w plik .htaccess w przypadku gdy chcialbym uzyczyc komus tylko jednego folderu na moim serwerze, a nie chce mu dawac dostepu do calosci. Dodam ze serwer w home.pl i ma swoje reguly, ale mimo tego korzystajac i czytajac wiele na ten temat zadna opcja nie dziala. Otoz generuje haslo przez generator .htpasswd wrzucam razem z .htaccess do jednego folderu i poprzez przegladarke wpisujac po adresie serwera /folder zadne haslo ani zaden login nie dziala i nie mam jak sie na ten folfer zalogowac. Folder potrzebny do przerzucenia jednej strony a przerzucajacy ma miec ograniczony dostep – tylko do swojego folderu Prosze o pomoc 🙂

  • Proszę dokładnie sprawdzić ścieżki dostępu. Podany sposób powinien działać na home.pl

  • Witam, dzieki za odpowiedz powyzsza metoda dziala jedynie na innych serwerach (mialem bledna sciezke do pliku htpasswd).Natomiast na home.pl plik .htaccess powinien mieć nastepujaca tresc:

    AuthName „Logowanie”
    Access allow all valid-user
    Options DirList

    Wrzucamy go do: „foldertestowy” na serwer.
    Uzytkownikow tworzymy poprzez panel administracyjny home.pl (Usługa ukrytego katalogu) i mozna sie logowac na http://naszastrona.home.pl/foldertestowy podajac uzytkownika wpisanego w panelu poprzez ta uslugę.

  • Tomasz

    Witam,
    Mam problem z tzw. przyjaznymi linkami

    reguła
    RewriteRule ^([^,]+)/([^,]+)/([^,]+)\.html http://www.strona.pl/index.php?p=var&id=$3 [NC,L]
    do podkatalogu nie działa natomiast w root do tej samej zawartości działa.
    Dodam że hosting jest w home.pl oraz jest ustawione przekierowanie tej drugiej domeny na podkatalog z poziomu panelu w home.pl.

  • Adam

    Witam Serdecznie 🙂
    Chciałbym się zapytać jak zabezpieczyć kilka wybranych folderów np:

    /foldery
    adam/tomek/marek/ola Chciałbym zabezpieczyć wszystko prócz folderu np marek a reszta bez hasła czyli folder adam/tomek/marek on bez hasła lecz inne z hasłem da radę coś takiego wykonać?

    Pozdrawiam Serdecznie.

  • Piotr Nalepa

    jeśli dobrze rozumiem, to folder ola jest wewnątrz folderu marek, który jest wewnątrz tomek, a ten w adam?
    Jaki jest sens takiego zabezpieczenia?
    Należy stworzyć osobne reguły dla każdej ścieżki dostępu.

  • Adam

    Witaj Piotrze 🙂
    Może źle się wyraziłem przepraszam 🙂

    W folderze mam adam/tomek/marek u marka obrazki które się wyświetlają, lecz gdy zabezpieczę to mi wszystko i nie wyświetla mi obrazków z folderu marka bo właśnie do niego trafiają obrazy :):) i chce zrobić taki prywatny 🙂 np: http://www.pewna-strona.pl/marek/jakis_obrazek.jpg

  • Xtronix856

    Ja mialem w poradniku napisane zeby użyć w .htaccess tego kodu i nie bardzo go rozumiem mogłby mi ktoś bardzo dokładnie wytłumaczyć…

    php_value auto_prepend_file „/home/uzytkownik /ponownie/naglowek.php”
    php_value auto_append_file „/home/uzytkownik/ponownie/stopka.php”