.htaccess - zopár tipov a trikov, ktoré sa môžu zísť každému

Publikované 25.3.2014 13:11   |  PHP, .htaccess 2

Práca s .htaccess, súborom serveru Apache, ktorý nám umožňuje kúzla s našimi webstránkami v neuveriteľnej miere. V tomto článku si ukážeme zopár tipov a trikov ako si spraviť pekné adresy URL, gzip kompresiu, zakázanie prístupu na určité IP adresy alebo na určitú zložku, heslovanie zložiek a aj jeden užitočný open-source pre pracovanie s doménami 3., 4., N. rádu.


1. Zabrániť používateľom prístup do určitej zložky

V prípade, že si neželáte, aby vám niekto mohol do určitej zložky pristupovať zvonku (máte tam nejaké skripty), môžete použiť v .htaccess príkaz deny from tak, že daný .htaccess vložíte do takej zložky, v ktorej už nechcete, aby bol prístup povolený. Použijeme kľúčové slovo all. Do tohto súboru vložíme následovný kód:

deny from all

POZOR! Tento krok zakáže aj prístup do všetkých ostatných zložiek, ktoré sú podriadené danej zložke. V prípade, že si už v určitej zložke neprajete, aby bol prístup zakázaný, je potrebné, aby ste do tejto zložky vložili opäť .htaccess súbor, teraz ale s obsahom allow from all. Tým už povolíte prístup v danej zložke a všetkým zložkám, ktoré su jej podriadené.

2. Zakázať/povoliť prístup užívateľom na určité IP adresy

Na zakázanie prístupu použijeme opäť príkaz deny from a namiesto all tam vložíme IP adresy. V prípade, že chcete zadať viac ako jednu, oddelíme ich medzerou:

deny from 123.456.789.0 321.654.987.1 1.2.3.4

Pre povolenie prístupu je to takmer rovnaké. Namiesto deny ale použijeme allow. To znamená, že ak niekto neobsahuje danú IP adresu aká je určená, nebude môcť pristúpiť do danej sekcie:

alow from 12.13.14.15

3. Zaheslovať prístup na určitú sekciu

Na zaheslovanie potrebujeme dva súbory - .htaccess a .htpasswd. Do danej sekcie, ktorú chceme zaheslovať vložíme .htaccess súbor s nasledujúcim obsahom:

AuthName "Chranena Zona" 
AuthType Basic 
AuthUserFile /absolutna/cesta/k/suboru/.htpasswd
AuthGroupFile /dev/null 
require valid-user

Riadkom

AuthUserFile /absolutna/cesta/k/suboru/.htpasswd

je ako už napísané potrebné napísať absolútnu cestu. Tú ak nepoznáte, môžete si ju zistiť tak, že do daného priečinku, kde plánujete uložiť .htpasswd súbor, PHP súbor s jednoduchým obsahom:

echo __FILE__;

Dostanete absolutnú cestu, napr. v tvare /home/mysite/file.php, len namiesto file.php tam vložíte .htpasswd.

Ak to budeme mať hotové, potom nám už len zostáva vytvoriť súbor .htpasswd a vyplniť ho obsahom. Tento súbor obsahuje prihlasovacie údaje o používateľovi, ktoré sú zašifrované. Získať tieto údaje môžeme napr. z tejto adresy. Ak by sme zadali údaje admin adminpass, dostaneme tento výstup:

admin:$apr1$q6FwlHg5$PazmHL7IY4kWIg/nPt.7P0

Tento vložíme a súbor uložíme. Následne ak sme všetko urobili ako to tu bolo napísané, môžeme si do prehliadača zadať našu chránenú sekciu a malo by od nás žiadať prihlasovacie údaje. Ak by sme ich zadali zle, malo by sa pýtať znova na údaje a ak ich zadáme správne, sekcia by sa nám mala samozrejme zobraziť. Toto demo je ukážkou toho, že to naozaj funguje. Ako prihlasovacie údaje použte admin adminpass.

4. Nastaviť GZIP kompresiu

Každý z nás chce aby bola naša stránka čo najrýchlejšia. GZIP kompresia práve pre to nesmie chýbať. Touto kompresiou sa zvýši rýchlosť našej webstránky už z toho dôvodu, že všetky obrázky/súbory budú mať menšiu veľkosťou bez straty na kvalite.

Na internete nájdeme mnoho spôsobov, ja používam tento, ktorý mi aj úspešne funguje podľa nezávislých testov:

<ifModule mod_headers.c>
# YEAR
<FilesMatch "\.(ico|gif|jpg|jpeg|png|flv|pdf)$">
  Header set Cache-Control "max-age=29030400"
</FilesMatch>
# WEEK
<FilesMatch "\.(js|css|swf)$">
  Header set Cache-Control "max-age=604800"
</FilesMatch>
# 45 MIN
<FilesMatch "\.(html|htm|txt)$">
  Header set Cache-Control "max-age=2700"
</FilesMatch>
</ifModule>

<IfModule mod_deflate.c>
  <FilesMatch ".(js|gif|css|html|jpg|jpeg|gif|png|tiff|woff)$">
    SetOutputFilter DEFLATE
  </FilesMatch>
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

Toto je ale len na vylepšenie GZIP kompresie. V prípade, že vám hosting neponúka v ich administrácii si túto kompresiu zapnúť, vložte ešte nasledujúce riadky:

<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>

5. SEO-Friendly URLs

Určite ste si všimli mnohé portály, ktoré mávajú adresy ako /clanok/moj-clanok-7.html. Je zrejme jasné, že si na každý článok nevytvárali osobitný súbor. Jedným z riešení je aj cez .htaccess pomocou mod_rewrite. Tento modul sa postará o to, aby sa nám určité adresy, ktoré podľa regulárnych výrazov rozozná, že majú pravidlo, ktoré ich má premeniť na ten pravý tvar. Povedzme, že ten tvar vyššie ma v skutočnosti fungovať ako clanok.php?id=7.

Použijeme príkaz RewriteRule, kde ako prvý tvar zadamé vzor, ktorý sa bude hľadať vtedy, ak daná adresa vedie k neexistujúcej ceste. Vo vzore využívame regulárne výrazy, ktoré nahradzujú rôzne znaky a ako druhý tvar vložíme to, čo sa spustí ak sa tento vzor bude zhodovať s URL adresou. Na koniec zadáme [L], čo znamená, že ak sa toto pravidlo vykonalo, už ďalšie pravidlá nám nebude treba hľadať, lebo máme, čo sme chceli.

Výsledný tvar by vyzeral následovne.

RewriteRule ^clanok/([a-zA-Z0-9-]+)-([0-9]).html$ /clanok.php?id=$2 [L]

Presnejšie, čo tieto pravidlá znamenajú a ako s nimi pracovať si môžete pozrieť napr. na tejto adrese. O regulárnych výrazoch je to podrobne vysvetlené na wikipédii.

6. Presmerovanie na iný cieľ

V určitom prípade chcete používateľovi povedať, že daná stránka už neexistuje alebo bola presunutá. Nechcete to robiť cez PHP skript, môžete využiť funkcie súboru .htaccess. Využijeme príkaz Redirect, kde ako prvý tvar zadáme adresu, ktorú chceme presmerovať a ako druhý tvar zadáme adresu, na ktorú sa má presmerovať. Pred tým, než ale tieto tvary zadáme je potrebné uviesť o aký druh presmerovania ide. Je to v tvare číslo a zväčša sa používa 301, čo znamená, že daná stránka už bola navždy presunutá, nie je to dočasné. Príklad môžeme vidieť tu.

Redirect 301 /vyhladaj http://www.google.com/

Kde ak zadá do URL adresy /vyhladaj, presmeruje ho to na google.

7. Presmerovanie z mojweb.sk na www.mojweb.sk, poprípade opačne

Je dôležité mať svoj web čo najvyššie vo vyhľadávaní. Jedným z najdôležitejšim problémom SEO je duplikácia obsahu. Ak máme web, ktorý má nejaký obsah (napr. mojweb.sk/o-mne) a je možné k nim pristúpiť z adresy http://mojweb.sk/o-mne a aj z http://www.mojweb.sk/o-mne, pre vyhľadávače to môže znamenať ako duplicitný obsah, čo môže ohroziť našu pozíciu vo vyhľadávačoch. Preto je dôležité, aby sme si ujasnili, ktorý tvar chceme a ak sme si vybrali, je potrebné pristupovať následovne:

Z mojweb.sk na www.mojweb.sk

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Z www.mojweb.sk na mojweb.sk

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

V prípade, že chcete na tvar z www.mojweb.sk na https://www.mojweb.sk, použite následovny tvar:

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

V opačnom prípade, ak to chcete prevrátiť tak:

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

8. Presmerovanie na mobilnú verziu, ak je použité mobilné zariadenie

Zrejme chcete ak máte verziu aj pre mobilné zariadenia, aby sa práve týmto klientom zobrazila automaticky už táto verzia. Jedným z riešením je pomocou .htaccess. Tento kód som získal z portálu Stack Overflow pri tejto otázke:

RewriteEngine On

# Check if this is the noredirect query string
RewriteCond %{QUERY_STRING} (^|&)noredirect=true(&|$)
# Set a cookie, and skip the next rule
RewriteRule ^ - [CO=mredir:0:%{HTTP_HOST},S]

# Check if this looks like a mobile device
# (You could add another [OR] to the second one and add in what you
#  had to check, but I believe most mobile devices should send at
#  least one of these headers)
RewriteCond %{HTTP:x-wap-profile} !^$ [OR]
RewriteCond %{HTTP:Profile}       !^$
# Check if we're not already on the mobile site
RewriteCond %{HTTP_HOST}          !^m\.
# Check to make sure we haven't set the cookie before
RewriteCond %{HTTP:Cookie}        !\smredir=0(;|$)
# Now redirect to the mobile site
RewriteRule ^ http://m.%{HTTP_HOST}%{REQUEST_URI} [R,L]

9. Nasmerovanie všetkých URL požiadaviek na súbor

Chystáte si vlastnú aplikáciu a chcete všetky URL požiadavky radšej riešiť cez PHP skript, ako pomocou modulu mod_rewrite. Ak zháňate kód, ktorý to urobí, ste na správnom mieste. Nasledujúci kód nasmeruje všetky požiadavky na súbor index.php. Ak chcete iný, len ho zmeníte:

DirectoryIndex index.php

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
    RewriteRule ^(.*) - [E=BASE:%1]

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule .? - [L]

    RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    <IfModule mod_alias.c>
        RedirectMatch 302 ^/$ /index.php/
    </IfModule>
</IfModule>

10. Domény 3., 4., N. rádu pomocou .htaccess

Máte vlastnú doménu a webhosting nepodporuje subdomény pomocou špeciálnych adresárov, poprípade to chcete mať po svojom? Existuje jeden dokonalý open-source, ktorý rieši subdomény práve pomocou .htaccess a jednoducho. Autorom tohto open-sourcu je Jan Pecha a nájdete to na githube, kde sa nachádza aj návod na použitie.

11. Zakázanie/povolenie listovania súborov v priečinku

V prípade, ak si chcete povoliť alebo zakázať, aby sa vám po zadaní určitého priečinku do URL adresy zobrazovali všetky súbory, použijeme príkaz Options a následne +Indexes ak chceme, aby sa nám zobrazovali všetky súbory a ak nechceme, vložíme -Indexes.

Takže plný tvar, ak chceme povoliť:

Options +Indexes

A ak chceme zakázať:

Options -Indexes

Komentáre

Václav píše:
06.4.2014 22:15:43[odpovedať]

"deny from all" je sice hezký a užitečný příkaz, bohužel však zabraňuje v použití určitého (PHP) souboru prostřednictvím AJAXu.

Eduard Karpiel píše:
07.4.2014 14:09:00[odpovedať]

@Vaclav to je pravda. Keď som o tom písal, tak som to neplánoval, že sa toto má využiť aj pre AJAX scripty. V prípade, že by sa niekto o to zaujímal, tak napr. tu stackoverflow.com/q/3466802 je riešenie.

Odoslať komentár

Posledné Referencie

Deffender BG & FUN private server Eduard Karpiel - portfólio VideoVizitky.SK Apartmány Maladinovo Lymfoštúdia Eva Czech Imperial Server

O Mne

Mám 20 rokov. Študujem Informatiku v odbore programovanie a taktiež sa venujem tvorbe nových webstránok. Pracujem s jazykmi

  • PHP (OOP) & MySQL
  • HTML & CSS (len drobné zmeny)
  • Symfony2 Framework (začiatočník, ale učím sa rýchlo - viď tento web)

Kontakt

V prípade záujmu alebo nejakého dotazu ma neváhajte kontaktovať na nižšie uvedených možnostiach. Poprípade môžete využiť kontaktný formulár

ICQ: 357-248-017
Skype: lkopo__ (upřednostňujte)
E-mail: