HTTP je bezestavovým protokolem aplikační vrstvy pracující nad TCP/IP. Původně byl navržen pro přenos hypertextových dat. Jeho univerzálnost jej ovšem předurčila k daleko širšímu použití. V současné době se používají 2 verze:
metoda cesta_dokumentu verze_protokolu hlavičky prázdný_řádek data
Název | Popis | Příklad |
---|---|---|
Accept | MIME typy, které dokáže klient zpracovat. | text/html, text/plain, image/jpeg |
Accept-Charset | Přijatelné znakové sady | iso-8859-2 |
Accept-Encoding | Přijatelné zakódování obsahu | compress, gzip |
Accept-Language | Přijatelné jazyky dokumentu | cs, en |
User-Agent | Klientský program uživatele | CtuWebPresTelnet1.0 |
Referer | Z které stránky klient přišel | http://www.fi.muni.cz/ |
If-Modified-Since | Byl dokument modifikovaný od zadané chvíle? | Tue, 11 Apr 2006 19:40:00 GMT |
verze_protokolu stavový_kód stavový_text hlavičky prázdný_řádek data_odpovědi
Název | Popis | Příklad |
---|---|---|
Content-Type | MIME typ odpovědi a znaková sada. | text/html; charset=ISO-8859-2 |
Content-Encoding | Kódování odpovědi | compress, gzip |
Content-Language | Jazyk odpovědi | en |
Content-Length | Délka odpovědi (počet bytů). | 11265 |
Server | Server, který odpověď poslal | Apache |
Location | Skutečné umístění obdrženého dokumentu | index.xhtml.cs |
Expires | Čas kdy vyprší platnost dokumentu | Wed, 08 Nov 2006 03:14:21 GMT |
Last-Modified | Datum poslední úpravy dokumentu | Wed, 08 Nov 2006 01:38:32 GMT |
$ telnet www.fi.muni.cz 80 Trying 147.251.48.1... Connected to aisa.fi.muni.cz. Escape character is '^]'. GET /index.xhtml HTTP/1.1 Host: www.fi.muni.cz Accept-Language: cs HTTP/1.1 200 OK Date: Wed, 08 Nov 2006 04:12:13 GMT Server: Apache Content-Location: index.xhtml.cs Vary: negotiate,accept-language,accept-charset TCN: choice Content-language: cs, cs Last-Modified: Wed, 08 Nov 2006 03:38:34 GMT ETag: "1f8bf89-2b20-4551513a-iso-8859-2;454d5c51" Accept-Ranges: bytes Content-Length: 11040 Content-Type: text/html; charset=iso-8859-2 <?xml version="1.0" encoding="iso-8859-2"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <!-- Generovano --> ...
$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost.localdomain. Escape character is '^]'. POST /okb/index.php HTTP/1.0 From: 139854@mail.muni.cz User-Agent: telnet Content-Type: application/x-www-form-urlencoded Content-Length: 14 password=xxx HTTP/1.1 200 OK Date: Wed, 08 Nov 2006 04:02:10 GMT Server: Apache/2.0.55 (Ubuntu) PHP/5.1.6 X-Powered-By: PHP/5.1.6 Set-Cookie: PHPSESSID=d115267eba6810fe9e2b178598b2393d; path=/ Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Content-Length: 704 Connection: close Content-Type: text/html; charset=UTF-8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head> ...
Protože je spousta důležitých informací o dokumentu přenášena ve formě http hlaviček, nastane problém, když otevřeme lokálně uložený html soubor. K němu totiž http hlavičky přímo nemáme. Proto je vhodné do html přidávat náhradu za tyto hlavičky - HTML META http-equiv:
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
Open source server, který vyvýjí The Apache Software Foundation. Podle výzkumu firmy Netcraft je Apache v současnosti na přibližně 60% z celkového počtu 102 miliónů veřejných webových serverů.
V současné době existují v zásadě tři verze serveru:
Dále se budu zabývat verzí 2.0.
Nastavení serveru je rozdělené do několika souborů. Všechny se typicky nacházejí v adresáři /etc/apache2
. Konfiguruje se pomocí direktiv, které se mohou vyskytnout v následujících kontextech:
apache2.conf
, vztahují se k celému serveru
<VirtualHost>
, vztahují se k jednomu konkrétnímu virtuálnímu serveru
<Directory>
, <Location>
nebo <Files>
, vztahují se k souborům/adreářům vybraným v parametrech sekce (k výběru se možné využít i regulární výrazy)
Následuje tabulka několika základních konfiguračních voleb.
název | popis | příklad |
---|---|---|
DocumentRoot | kořen dokumentů virtuálního serveru | DocumentRoot /var/www/ |
DirectoryIndex | soubory, které server hledá v adresáři, aby je zobrazil, když uživatel zadá adresu adresáře | DirectoryIndex index.html index.cgi index.pl index.php index.xhtml |
ServerAdmin | e-mailová adresa správce serveru | ServerAdmin admin@speo.lab.fi.muni.cz |
AllowOverride | určuje, které direktivy mohou být nahrány ze souborů .htaccess (povolené nastavení v .htaccess pak převáží globální nastavení). Může nabývat hodnot:All | None | (AuthConfig | FileInfo | Indexes | Limit | Options)* | AllowOverride AuthConfig Indexes |
Options | nastavuje (nebo upravuje) povolené funkce pro daný adresář. Například zobrazení obsahu adresáře, spouštění CGI skriptů, povolení SSI, ... | Options -Indexes |
Na každém serveru může současně běžet mnoho virtuálních serverů. A každý z nich může být jinak nastavený. Všechny nakonfigurované virtuální servery by měly být v adresáři /etc/apache2/sites-available
. Zapínají se pak přidáním symbolického odkazu do adresáře /etc/apache2/sites-enabled
.
Jsou dva typy rozslišení jednotlivých virtuálních serverů:
NameVirtualHost * <VirtualHost *> ServerName speo.lab.fi.muni.cz ServerAdmin webmaster@speo.lab.fi.muni.cz DocumentRoot /var/www-speo/ <Directory /var/www-speo/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> </VirtualHost> <VirtualHost *> ServerName speo-alpha.lab.fi.muni.cz DocumentRoot /var/www-alpha/ </VirtualHost>
<VirtualHost 10.0.0.40> ServerName speo.lab.fi.muni.cz DocumentRoot /var/www-speo/ </VirtualHost> <VirtualHost 10.0.40.1> ServerName speo-alpha.lab.fi.muni.cz DocumentRoot /var/www-alpha/ </VirtualHost>
Apache je silně modulární. V oficiální distribuci je okolo 60 modulů, na internetu jich je dostupných několik stovek. Konfigurace k jednotlivým modulům je v adresáři /etc/apache2/mods-available
, zapnuté moduly mají symbolický odkaz ke konfiguraci v adresáři /etc/apache2/mods-enabled
.
Příklad konfigurace modulu mod_userdir
(v praxi je rozdělena na dva soubory userdir.load
a userdir.conf
):
LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so <IfModule mod_userdir.c> UserDir public_html UserDir disabled root <Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec </Directory> </IfModule>
Další možnosti Apache raději ukážu na konkrétních úkolech.
Allow, Deny, Order
Filtrování uživatelů podle doménového jména, IP adresy (nebo rozsahu IP adres) nebo parametrů HTTP požadavku.
Příklad podle IP:Order Deny,Allow Deny from all Allow from 10 172.20 192.168.2 Allow from fi.muni.czPříklad podle proměnné prostředí:
SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in Order Deny,Allow Deny from all Allow from env=let_me_in
mod_ssl
, direktivy SSLEngine, SSLCertificateKeyFile, SSLCertificateFile
a mnoho dalších
SSL (resp. TSL) je protokol transportní vrstvy pro zabezpečenou komunikaci. Využívá jak asymetrickou kryptografii (při vytváření spojení), tak symetrickou kryptografii (pro samotná data). Tento protokol implementuje například OpenSSL.
Protože protokol SSL obaluje HTTP, je SSL sezení oddělené od HTTP sezení. SSL požadavek neobsahuje jméno hostitele, proto není možné použít více virtuálních serverů se SSL odlišených podle jména. Podle IP adresy to samozřejmě možné je. Příklad vytvoření tajného klíče a certifikátu:
# vytvoření tajného klíče $ openssl genrsa -out server.key 1024 # vytvoření CSR (Certificate signing request) $ openssl req -new -key server.key -out server.csr # certifikát pak generuje certifikační autorita. Pro testovací učely si to můžeme podepsat sami: $ openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365Příklad konfigurace:
<VirtualHost _default_:443> SSLEngine On SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key SSLProtocol All -SSLv2 SSLCipherSuite HIGH:MEDIUM </VirtualHost>
mod_cgi, mod_php5,
atd., direktivy Options, AddType
CGI (Common Gateway Interface) umožňují pomocí skriptů dynamicky generovat data zasílaná klientovi.
Příklad s CGI:LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so # modul cgi AddHandler cgi-script .cgi # akce pro soubory .cgi ScriptAlias /cgi-bin/ "/var/www/cgi-bin" # alias pro adresář s cgi skripty <Directory "/var/www/cgi-bin"> # nastavení adresáře Options ExecCGI </Directory>Příklad s PHP:
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so # modul php AddType application/x-httpd-php .php .phtml .php3 # typ php souboru AddType application/x-httpd-php-source .phps
mod_negotiation
, direktivy Options, AddType
Často chceme mít jeden dokument ve více jazycích a kódováních. Apache podporuje vyjednávání obsahu podle HTTP/1.1. Klient může zaslat následující hlavičky:
V zásadě máme několik možností:
AddHandler type-map .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, dePříklad s MultiViews:
Options +MultiViews
mod_auth
, direktivy AuthType, AuthName, AuthUserFile, Require
Protože protokol HTTP nemá žádnou podporu pro sezení, je potřeba autentizaci provádět při každém požadavku. Existuje několik možností:
WWW-Authenticate
a stav HTTP/1.0 401 Unauthorized
) U HTTP Basic autentizace je potřeba vytvořit hesla, k tomu slouží příkaz htpasswd
.
AuthType Basic AuthName "Restricted Files" AuthUserFile /etc/apache2/passwords Require valid-user
mod_rewrite
, direktivy RewriteEngine, RewriteRule, RewriteCond
Pokud chceme získat na našem webu snadno zapamatovatelné a atraktivní adresy, které ovšem všechny obslouží jeden (např. PHP) skript, nezbývá než použít přepis adres.
Ten způsobí, že navenek se zdá, že přistupujeme k pěkné adrese (např. http://www.firma.cz/kontakt
), ve skutečnosti se tato adresa uvnitř serveru přepíše na úplně jinou (např. http://www.firma.cz/index.php?name=kontakt
).
RewriteEngine On RewriteCond %{REQUEST_URI} ^/$ RewriteRule ^(.*)$ /index.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{QUERY_STRING} ^(.*)\/?$ RewriteRule ^(.*)$ /index.php?name=$1 [L]
Syntaxe je poměrně komplexní a umožňuje i mnoho jiných způsobů využití.
V porovnání se serverem Apache jsou všechny ostatní dost marginální. Přesto exituje několik alternativ: