MP08 - UF2: Servidors d'aplicacions web
Arquitectura Multinivell (ii)
Nosaltres implementarem el MVC en una la plataforma LAMP per tant, la configuració que donarem és unica i exclusivament pel servidor web Apache. En altres implemetacions web (Linux vs Windows, Apache vs Nginx, MySQL/MariaDB vs PostgreSQL, PHP vs Perl vs Python, etc) caldrà buscar la forma d'implementació. Hem de tenir en compte, que a part de la configuració d’Apache, el llenguatge de PHP també compta amb un fitxer de configuració que en defineix els paràmetres sobre la seva execució.
Implementació
Val a dir que en el MVC el més característic a nivell de servidor web és el format de les URLs ja que aquestes no inclouen el nom del fitxer a accedir. A la següent URL
https://www.institutmontilivi.cat/oferta-formativa/cicles-formatius-grau-superior/
no sabem quin document es mostra, i, si anem treient els directoris des del final de la URL, veurem que realment, cada URL ens porta a un lloc diferent.
i segur que no tenim al lloc web una estrutura de directoris com la que sembla.
Llavors, com funciona? Com sabem a quin fitxer hem d'anar a obrir?
Molt senzill, sempre es va al mateix fitxer. Aquest fitxer analitza la URL i segons el que hi hem posat, executarà unes comandes o unes altres.
A nosaltres, com a configuradors del site, l'únic que ens ha de preocupar és com indicar al servidor apache que qualsevol crida accedeixi sempre, o millor dit quasi sempre, al mateix fitxer.
El que farem serà indicar-li que obri el fitxer index.php
sempre que el que es demani no sigui un fitxer o un directori existent. D'aquesta manera podrem deixar descarregar altres fitxers que tinguem dins l'estructura de fitxers com ara imatges, fulls d'estils, fitxers de javascript, etc. La condició pel contexte podem obviar-la en la majoria d'ocasions.
Per això farem que el directori on tinguem el MVC es comporti segons els següents paràmetres:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
Analitzem cadascuna de les línies:
-
RewriteEngine On
: activa elrewrite
en aquest directori i subdirectoris. -
RewriteBase /
: especifica el path relatiu d'aquest directori dins la URL del nostre site. -
RewriteCond %{REQUEST_FILENAME} !-f
i -
RewriteCond %{REQUEST_FILENAME} !-d
: defineixen condicions sobre quan SÍ o NO ! s'aplica elrewrite
. Una o més directivesRewriteCond
poden precedir una directivaRewriteRule
. La regla següent només s'utilitza si l'estat actual de l'URI coincideix amb el seu patró i si es compleixen aquestes condicions. -
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
: La directivaRewriteRule
és l’autèntic cavall de batalla de la reescriptura. La directiva es pot produir més d’una vegada i cada instància defineix una regla de reescriptura única. L'ordre en què es defineixen aquestes regles és important: és l'ordre en què s'aplicaran en temps d'execució.
En el nostre cas especifica que quan no sigui una petició que acabi en .css .js .icon .zip .rar .png .jpg .gif .pdf (!\\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$
) executarà el fitxer index.php
i no aplicarà cap altre rewrite gràcies al flag [L] que indica que és el darrer que s'aplica Last.
Per utilitar les directives Rewrite
cal habilitar el mòdul rewrite
.
Estic aquí https://blog.nginx.org/blog/creating-nginx-rewrite-rules
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
Analitzem cadascuna de les línies:
-
RewriteEngine On
: activa elrewrite
en aquest directori i subdirectoris. -
RewriteBase /
: especifica el path relatiu d'aquest directori dins la URL del nostre site. -
RewriteCond %{REQUEST_FILENAME} !-f
i -
RewriteCond %{REQUEST_FILENAME} !-d
: defineixen condicions sobre quan SÍ o NO ! s'aplica elrewrite
. Una o més directivesRewriteCond
poden precedir una directivaRewriteRule
. La regla següent només s'utilitza si l'estat actual de l'URI coincideix amb el seu patró i si es compleixen aquestes condicions. -
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
: La directivaRewriteRule
és l’autèntic cavall de batalla de la reescriptura. La directiva es pot produir més d’una vegada i cada instància defineix una regla de reescriptura única. L'ordre en què es defineixen aquestes regles és important: és l'ordre en què s'aplicaran en temps d'execució.
En el nostre cas especifica que quan no sigui una petició que acabi en .css .js .icon .zip .rar .png .jpg .gif .pdf (!\\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$
) executarà el fitxer index.php
i no aplicarà cap altre rewrite gràcies al flag [L] que indica que és el darrer que s'aplica Last.
Per utilitar les directives Rewrite
cal habilitar el mòdul rewrite
.
On ho implemento?
Podem implementar-ho en un fitxer .htaccess
que tindrem dins el directori base del MVC. Aquesta no és la millor opció però com que no sempre tenim accés als fitxers del servidor de vegades és la única opció. I la més fàcil sempre que ens deixin.
Sempre que ens deixin? Sí, cal que s'hagi habilitat el mòdul rewrite i que des dels fitxers de configuració de l'apache se'ns permeti utilitzar la directiva Rewrite
al fitxer .htaccess
.
Habilitem el mòdul rewrite
a2enmod rewrite
i reiniciem el servidor
Permetem regles rewrite
al .htaccess
Utilitzarem la directiva Allowoverride FileInfo
.
Per això cal especificar en quin directori ho permetem i en aquest exemple provarem de fer-ho al directori /var/www/mvc/
on farem que s'executi sempre el fitxer index.php
.
Dins el fitxer /etc/apache2/sites-available/000-default.conf
afegirem les següents línies
Alias /mvc /var/www/mvc
<Directory /var/www/mvc>
Options -Indexes
Allowoverride FileInfo
</Directory>
Ara cal crear un fitxer al directori /var/www/mvc
anomenat .htaccess
amb el següent contingut:
RewriteEngine On
RewriteBase /mvc
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(css|js|icon|zip|rar|png|jpg|gif|pdf)$ index.php [L]
hi afegirem un fitxer index.php
amb el següent contingut
<?php
echo "Has demanat <b>" . $_SERVER["REQUEST_URI"] . "</b> però t'ensenyo el <b>" . $_SERVER["SCRIPT_NAME"] . "</b>";
?>
-
A l'accedir a la URL http://ipdelservidor/mvc/ mostra
Has demanat /mvc/ però t'ensenyo el /mvc/index.php
-
A l'accedir a la URL http://ipdelservidor/mvc/modul/mp08/ mostra
Has demanat /mvc/modul/mp08/ però t'ensenyo el /mvc/index.php
A partir d'aquí, amb les variables de php $_SERVER
podrem esbrinar el que l'usuari ha posat a la URL i realitzar una o una altra acció.
D'això ja se n'ocupa el framework mvc que utilitzem. Cadascun d'ells pot utilitzar diferents tècniques.
Cal tenir en compte que les línies poden necessitar alguna modificació depenent de com vulguem que actui el servidor segons el que se'ns demana.
Solem afegir la línia RewriteCond %{REQUEST_FILENAME} !-f
per si se'ns demana algun fitxer que sí que existeix, tipus imatge, full d'estils, de codi javascript, etc.
La línia RewriteCond %{REQUEST_FILENAME} !-d
ja no cal posar-la si no volem mostar res de directoris complets (Indexes
).
Ara només cal llegir la documentació de l'apache en cas de qualsevol altra necessitat i aplicar-la correctament.
Resumint
Per treballar amb pàgines web que utilitzen el MVC, ja sigui de frontend o de backend, utilitzem el mòdul rewrite
per tal de redirigir les peticions, sigui quina sigui la URL, a mateix fitxer del servidor, php, html o altre.
Cal, però, des del servidor web, habilitar i permetre la directiva Rewrite
al directori on tinguem el nostre fitxer.
Per més informació...
trobareu un bon tutorial/explicació amb exemples a https://www.sitepoint.com/apache-mod-rewrite-examples/ i la segona part a https://www.sitepoint.com/apache-mod-rewrite-examples-2/