HTTP
0. Objectivos
Conhecer estrutura de pedido HTTP.
Restringir acessos a páginas com autenticação.
Configurar servidor com múltiplos domínios alojados.
Configurar HTTP/2
Configurar redireccionamentos internos e externos.
1. Pedido HTTP
1.1. Utilizando o comando telnet, reproduza o envio de um pedido HTTP ao servidor WWW do ISEP. telnet www.isep.ipp.pt 80
GET / HTTP/1.0
Host: www.isep.ipp.pt (linha em branco)
1.2. Experimente também solicitar apenas as linhas de cabeçalho relativas à página de entrada do site do ISEP.
telnet www.isep.ipp.pt 80 HEAD / HTTP/1.0
Host: www.isep.ipp.pt (linha em branco)
Analise as linhas de cabeçalho recebidas do servidor.
1.3. Reproduza um pedido da página do curso de Mestrado: www.dee.isep.ipp.pt/meec. Siga os redireccionamentos indicados até conseguir obter a página pretendida.
2. Instalação e Configuração de Servidor Web
2.1. Arranque o servidor HTTP (Apache) no seu computador de trabalho: service httpd start
2.2. Habilite o acesso ao servidor Web através da firewall local.
iptables -I INPUT 1 -j ACCEPT -p tcp --destination-port 80
3. Domínios Virtuais
3.1 Verifique que os domínios sitennX.labredes.dee.isep.ipp.pt se encontram registados no DNS como nomes alternativos da sua máquina.
3.2 Edite o ficheiro de configuração do servidor Apache (/etc/httpd.conf) de forma a criar 4 domínios virtuais correspondentes aos nomes atribuídos à sua máquina ( site_A a site_D).
DocumentRoot "/www/site_A"
ServerName sitexxA.labredes.dee.isep.ipp.pt </VirtualHost>
<Directory "/www/site_A">
# aceita diretivas definidas nos ficheiros .htaccess AllowOverride All
# permite o acesso a partir de qualquer máquina Require all granted
</Directory <VirtualHost *:80> DocumentRoot "/www/site_B" ServerName sitexxA.labredes.dee.isep.ipp.pt </VirtualHost> <Directory "/www/site_B"> AllowOverride All Require all granted </Directory>
...
3.3 Recarregue o ficheiro de configuração para ativar as alterações efetuadas.
3.4 Crie os diretórios para alojar cada um dos domínios, conforme especificado nas directivas DocumentRoot:
mkdir /www/site_A mkdir /www/site_B mkdir /www/site_C mkdir /www/site_D
3.5 Instale uma página de teste em cada um dos domínios:
wget ave.dee.isep.ipp.pt/~jml/ingre/lab_http/idx_php.txt -O /www/site_A/index.php wget ave.dee.isep.ipp.pt/~jml/ingre/lab_http/idx_php.txt -O /www/site_B/index.php wget ave.dee.isep.ipp.pt/~jml/ingre/lab_http/idx_php.txt -O /www/site_C/index.php wget ave.dee.isep.ipp.pt/~jml/ingre/lab_http/idx_php.txt -O /www/site_D/index.php 3.6 Utilizando um navegador Web (browser), verifique que consegue aceder às páginas instaladas para
cada um dos domínios.
firefox http://sitennnA.labredes.dee.isep.ipp.pt
3.7 Verifique também que consegue aceder às páginas dos domínios de outros colegas do laboratório.
4. Controlo de acesso
É possível definir restrições de acesso às paginas, obrigando os clientes a autenticarem-se através de username e password. No directório em que se pretender impor restrições de acesso, deve ser colocado um ficheiro, tipicamente com o nome .htaccess (nome configurado no ficheiro httpd.conf). Neste ficheiro podem ser definidos os utilizadores com acesso permitido e a localização do ficheiro .htpasswd onde se encontram as respectivas passwords.
4.1. No diretório de alojamento do domínio site_A crie um ficheiro .htaccess com o conteúdo seguinte:
AuthType Basic AuthName "Lab.HTTP"
AuthUserFile /home/my_username/.htpasswd Require valid-user
4.2. Para gerar ou alterar as passwords do ficheiro .htpasswd pode ser usado o utilitário htpasswd. Crie um ficheiro .htpasswd no seu directório principal, definindo a password de um utilizador ingre.
htpasswd -c /home/alunos/nr_aluno/.htpasswd ingre 4.3. Verifique que o ficheiro .htpasswd foi criado com sucesso
cat ~/.htpasswd
O seu conteúdo deve ser semelhante a: ingre:ak1Xbh3pSLDPI
4.4. Verifique que só tem acesso aos conteúdos publicados deste domínio quem possuir as respectivas credenciais.
4.5. Verifique também que o acesso aos restantes domínios não foi afetado.
5. Reescrita (rewrite)
5.1 No ficheiro .htaccess da área site_B, crie uma regra de reescrita (rewrite) que permita redirecionar todos os acessos a conteúdos com prefixos sC para a página inicial do site site_C
RewriteEngine on
RewriteRule ^sC http://sitennnC.labredes.dee.isep.ipp.pt/ [R]
Utilizando um navegador WWW, experimente aceder a
http://sitennB.labredes.dee.isep.ipp.pt/sC
5.2 No ficheiro .htaccess da área site_B, crie também uma regra de rewrite que permita obter recursivamente (via proxy) a página inicial do site site_D quando forem solicitados conteúdos com prefixos sD.
RewriteRule ^sD http://sitennnD.labredes.dee.isep.ipp.pt/ [P]
Utilizando um navegador WWW, experimente aceder a
http://sitennB.labredes.dee.isep.ipp.pt/sD_any_thing
Compare este resultado com o obtido na experiência 5.1
5.3 Adicione uma nova uma regra que permita registar e assinalar como proibidos os acessos a conteúdos com o prefixo sE
RewriteRule ^sE - [L,F]
Utilizando um navegador WWW, experimente aceder a
http://sitennB.labredes.dee.isep.ipp.pt/sE/some_text
5.4 Crie um redireccionamento dos conteúdos solicitados da directoria /city do domínio sitennB para a página da Wikipédia com o mesmo nome.
http://sitennB.labredes.dee.isep.ipp.pt/city/Braga -> https://www.wikipedia.org/wiki/Braga Utilizando um navegador WWW, experimente aceder a
http://sitennB.labredes.dee.isep.ipp.pt/city/Aveiro
6. HTTP2
O servidor Apache pode suportar HTTP/2, se configurado para incluir o módulo mod_http2.so. 6.1. Prepare um ficheiro de configuração /etc/httpd/conf.modules.d/10-h2.conf com o seguinte
conteúdo:
LoadModule http2_module modules/mod_http2.so Protocols h2 h2c http/1.1
6.1. Arranque (ou re-arranque) o servidor httpd da sua máquina: service httpd restart
6.2. Verifique que é possível obter uma página através de HTTP/2. curl --http2 http://localhost/test.html
Neste processo, o cliente curl inicia um pedido HTTP/1.1, aplicando de seguida um pedido de upgrade para HTTP/2.
6.3. Confirme este processo repetindo o pedido depois de lançar um analisador de tráfego numa outra janela.
tcpdump -i lo 'tcp port 80'
6.4. Experimente obter a mesma página assumindo que o suporte ao HTTP/2 no servidor implementado é previamente conhecido. Desta forma o cliente irá tentar utilizar nativamente um pedido HTTP/2, sem recorrer ao mecanismo de HTTP/2 upgrade.
curl --http2-prior-knowledge http://localhost/test.html
6.5. Para permitir o suporte de ligações nativas em HTTP/2, acrescente o protocolo h2c à linha Protocols do ficheiro de configuração do módulo http2.
Protocols h2 h2c http/1.1
6.6. Experimente novamente obter a página através de um pedido nativo HTTP/2.
curl --http2-prior-knowledge http://localhost/test.html
7. Registo de acessos
Analise o registo de acessos do seu servidor Web cat /var/log/httpd/access_log
8. Bibliografia
Apache HTTP Server, Authentication and Authorization, http://httpd.apache.org/docs/current/howto/auth.html Apache HTTP Server, Access Control, http://httpd.apache.org/docs/current/howto/access.html
Apache HTTP Server, Virtual Host, http://httpd.apache.org/docs/current/vhosts Apache HTTP Server, mod_rewrite, http://httpd.apache.org/docs/current/rewrite