HTTP (Hypertext transfer protocol) je aplikačný protokol nad TCP. HTTP servery sú štandardne dostupné na TCP porte 80, resp. 443 pre zabezpečené HTTP (HTTPS). Komunikácia pozostáva zo servera a klienta, kde klient nadviaže spojenie zo serverom, pošle mu požiadavku (angl. request), na ktorú server zašle odpoveď (angl. response).
Method SP Request-URI SP HTTP-Version CRLF Header1: Value1 CRLF ... CRLF [ message-body ]
napr.
GET /prednasky.cgi?fakulta=1433 HTTP/1.0 Host: www.video.muni.cz
HTTP-Version SP Status-Code SP Reason-Phrase CRLF Header1: Value1 CRLF ... CRLF [ message-body ]
napr.
HTTP/1.1 200 OK Date: Sun, 01 Nov 2015 09:44:40 GMT Server: Apache/2.2.16 (Debian) PHP/5.3.3-7+squeeze25 with Suhosin-Patch mod_ssl/2.2.16 OpenSSL/0.9.8o mod_perl/2.0.4 Perl/v5.10.1 Connection: close Content-Type: text/html; charset=utf-8
GET | Získanie obsahu entity identifikovanej pomocou Request-URI |
---|---|
POST | Vytvorenie novej podriadenej entity pod entitou identifikovanou pomocou Request-URI |
PUT | Vytvorenie alebo úprava entity identifikovanej pomocou Request-URI |
DELETE | Zmazanie entity identifikovanej pomocou Request-URI |
CONNECT | Nadviazanie spojenia |
GET /clanky?zoradenie=datum
POST /clanky
GET /clanky/1
PUT /clanky/1
DELETE /clanky/1
1XX | Informácie |
---|---|
2XX | Úspech |
3XX | Presmerovanie |
4XX | Chyby na strane klienta |
5XX | Chyby na strane servera |
Oficiálne stránky: https://httpd.apache.org/
Listen 80 User www-data Group www-data AccessFileName .htaccess
Direktívy, ktoré sa vzťahujú len na konkrétny virtuálny host, napr.:
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName localhost ServerAlias *.localhost DocumentRoot /var/www ErrorLog /var/apache/default-error.log CustomLog /var/apache/default-access.log combined </VirtualHost>
Direktívy, ktoré sa vzťahujú len na konkrétny adresár, napr.:
<Directory /var/www> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory>
Ak sa na nejaký adresár vzťahuje direktíva AllowOverride All , je možné pomocou súboru s názvom definovaným v direktíve AccessFileName (typicky .htaccess) definovať niektoré ďalšie konfiguračné direktívy, ktoré Apache HTTP server použije pri spracovávaní HTTP požiadavky na objekt vnútri daného adresára.
Rôzne distribúcie linuxu môžu mať rôzne umiestnenia a názvy. Príklady
HTTP komunikácia štandardne nie je šifrovaná, preto nie je možné zaistiť jej dôvernosť. Na zaistenie dôvernosti HTTP komunikácie sa využíva šifrovanie založené na certifikátoch. V Apache HTTP serveri podporu zaisťuje modul SSL, ktorý využíva knižnicu OpenSSL.
Pri virtuálnych hostoch založených na názvoch (name-based virtual hosts) je potrebné, aby server v čase nadväzovania zabezpečenej komunikácie vedel, aký certifikát a kľúč má použiť (z ktorého virtuálneho hostu). Tento problém rieši SNI (Server Name Indication), ktoré pridáva možnosť klienta zaslať serveru názov hostu pri úvodnom handshake.
Je potrebné mať načítaný modul SSL:
LoadModule ssl_module modules/mod_ssl.so
V distribúcii Debian alebo Ubuntu je možné zapnúť pomocou príkazu:
a2enmod ssl
<VirtualHost *:443> # .. konfigurácia hostu SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key </VirtualHost>
CGI (Common Gateway Interface) je rozhranie, ktoré typicky slúži na prístup k nejakému informačnému systému pomocou HTTP. Toto rozhranie býva implementované pomocou skriptov v ľubovoľnom skriptovacom jazyku, ktorý server podporuje. Skripty obvykle pristupujú k databáze alebo iným zdrojom daného informačného systému a zo získaných informácií generujú HTML výstup.
Je potrebné mať v Apache HTTP serveri povolený modul CGI:
LoadModule cgi_module modules/mod_cgi.so
Ďalej je potrebné pre daný virtual host nakonfigurovať URL prefix, z ktorého budú požiadavky smerované do adresára obsahujúceho CGI skripty. Tento adresár obvykle býva mimo koreňového adresára webservera, definovaného v DocumentRoot.
ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"
Alebo je možné nastaviť, aby sa súbory s určitou príponou spúšťali ako CGI skripty
AddHandler cgi-script .pl AddHandler cgi-script .php
Príklad CGI skriptu v jazyku PERL
#!/usr/bin/perl print "Content-type: text/html\n\n"; print "Hello, World.";
Príklad CGI skriptu v jazyku PHP
#!/usr/bin/php-cgi echo "Hello world";
Apache HTTP server je schopný na základe hlavičiek Accept-charset a Accept-language zistiť preferencie klienta na kódovanie, resp. jazyk požadovaného dokumentu. Pre podporu výberu dokumentu na základe preferencií klienta je potrebný modul Negotiation.
LoadModule negotiation_module modules/mod_negotiation.so
Ďalej je potrebné nastaviť pre virtual host možnosť MultiViews a príponu súboru s mapou typov dokumentu:
Options MultiViews AddHandler type-map .var
Príklad súboru foo.var
URI: foo URI: foo.en.html Content-type: text/html Content-language: en URI: foo.fr.de.html Content-type: text/html;charset=iso-8859-2 Content-language: fr, de
Tiež je možné pomocou modulu MIME asociovať prípony súborov s požadovaným znakovým kódovaním, resp. jazykom:
LoadModule mod_mime /usr/lib/apache2/modules/mod_mime.so
AddLanguage ja .ja AddCharset UTF-8 .utf8
S každým HTTP požiadavkom klient posiela hlavičku Authorization obsahujúcu prihlasovacie údaje používateľa zakódované pomocou Base64
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Ak klient nie je autentizovaný a server vyžaduje autentizáciu, server posiela hlavičku WWW-Authenticate
WWW-Authenticate: Basic realm="Realm"
V Apache HTTP serveri je podpora HTTP autentizácie implementovaná v module mod_auth_basic
Príklad konfigurácie, kde používatelia sú načítaní zo súboru .htpasswd
<Location /secure> AuthType basic AuthName "private area" AuthBasicProvider file AuthUserFile .htpasswd Require valid-user </Location>
Klient pomocou prihlasovacieho formulára odošle serveru prihlasovacie údaje, na základe ktorých server overí používateľa. Server po overení nastaví používateľovi cookie obsahujúcu náhodný token, ktorou sa môže pri ďalších požiadavkách identifikovať. Táto cookie sa nazýva Session cookie.
Spracovanie niektorých požiadaviek môže na serveri vyžadovať zvýšenú záťaž (overhead), ktorá sa pri rastúcom počte používateľov môže prejaviť ako problém. Typicky sa jedná o spúšťanie CGI skriptov, ktoré dynamicky generujú svoju odpoveď. Aby server nemusel zakaždým spúšťať skript, ktorý vygeneruje stále rovnakú odpoveď, je možné použiť HTTP cache.
Server pošle v odpovedi hlavičku obsahujúcu informáciu, do kedy je daná odpoveď platná. HTTP proxy cache potom po celú dobu zasiela túto odpoveď bez ďalšieho dotazovania servera.
Expires: Thu, 01 Mar 2011 16:00:00 GMT
Server pošle v odpovedi hlavičku, ktorá obsahuje informáciu o poslednej zmene (Last-modified), resp. špeciálnu značku (ETag) predstavujúcu danú verziu dokumentu. HTTP proxy cache si odpoveď uloží a následne serveru zasiela hlavičku "If-modified-since", alebo "If-None-Match" v prípade ETag. V tomto prípade je server dotazovaný vždy a má zmysel ho použiť vtedy, keď zistenie poslednej zmeny, resp. výpočet ETag je oveľa jednoduchší, ako vygenerovanie celého výstupu.