---
title: 002. Apache mod_rewrite
tags: daw, apache, M8
---
# mod_rewrite per Apache2.
[vincle a font en MarkDown](https://hackmd.io/@JdaXaviQ/BySZxvXFF)
---
## 1. Utilitat de mod_rewrite.
El mòdul __mod_rewrite__ de l'Apache ens permet realitzar un preprocès de la URL que ens arriva del client abans executar la consulta web.
És una eina molt poderosa que literalment ens permet reescriure les URL que ens arriven del client.
Les motivacions poden ser diverses i al llarg d'aquesta UF en trobarem unes quantes raons per reescriure les peticions que arriven al nostre servidor.
## 2. Requisits.
Abans de començar a utilitzar el mòdul mod_rewrite hem d'habilitar-lo amb la comanda:
```bash=
$ sudo a2enmod rewrite ; sudo systemctl restart apache2
```
De vegades volem que les regles de sobrescritura no estiguin dins dels fitxers de configuració general del nostre servidor web. Si és així, haurem d'habilitar que les regles de configuració es puguin sobrescriure dins del mateix fitxer utilitzant el fitxer __.htaccess__.
Per a que el nostre servidor faci ús de les regles especificades al fitxer .htaccess haurem de modificar el fitxer /etc/apache2/apache2.conf i afegir les seguents línies per tal de poder realitzar reescritures que afectin al directori __/var/www/api__.
```
<Directory /var/www/api/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
```
## 3. Regles de substitució.
Ara ens toca editar el fitxer .htaccess i escriure les nostres regles de sobreescriptura. Per exemple: si volguessim accedir a la pàgina http://api.localhost/about.html escrivin-t'hi només http://api.localhost/about ho podriem fer amb la següent regla al nostre fitxer /var/www/api/.htaccess.
```
RewriteEngine on
RewriteRule ^about$ about.html [NC]
```
D'aquesta manera li estem indicant que quan la URL a partir del nostre nom de domini matxi amb l'expressió regular ^about$ la substituirem per 'about.html'. Els flags [NC] del final indiquen que la comparació sera case insensitive.
## 4. Condicions.
No sempre volem que les regles s'executin sense cap mirament, de vegades ens interessa afegir condicions que limitin l'abast de les regles. Les condicions s'escriuen damunt de les regles i tenen el següent aspecte:
```
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule . /
```
Amb l'exemple anterior redireccionem al client al nostre home quan la seva URL no coincideix ni amb un fitxer regular ni amb un link ni amb un directori dins del nostre path.
També podríem aplicar condicions a certes regles tenint en compte el métode utilitzar pel client a l'hora de cridar a la nostra pàgina:
```
RewriteCond %{REQUEST_METHOD} "GET"
RewriteRule ^about$ about.html [NC]
RewriteCond %{REQUEST_METHOD} "POST"
RewriteRule ^about$ about_post.html [NC]
```
## 5. Altres exemples:
* Transformar una URL tipus API en una URL amb paràmetres tipus GET query.
```
RewriteRule ^pelicula/([^/]+)/(.+) pelicula.php?titol=$1&actor=$2
```
## 6. Logging.
mod_rewrite permet triar el nivell de detall que deixa al log del servei. Els nivells van des de trace1 a trace8 amb nivell de detall creixent. El nivell es pot especificar utilitzant la directiva LogLevel.
```
LogLevel alert rewrite:trace3
```
## 7. Flags que s'utilitzen sovint
|Flag | Funció|
|---|---|
|L| __last__: indica al mòdul rewrite que si s'executa aquesta regla no ha de continuar. És equivalent a l'ús de la comanda 'break' de C.|
|F| __forbidden__: el servidor enviarà un status 403 Forbidden al client. |
|R| __redirect__: s'efectua una redirecció HTTP. |
Els flags es poden combinar i aplicar-ne més d'un en una mateixa regla.