La direttiva Order in Apache

Uno dei punti fondamentali1 da comprendere per il controllo del proprio server Apache è la direttiva Order, quella in cui vediamo Allow,Deny o Deny,Allow. Non è di immediata comprensione ma, una volta capito il meccanismo che sta alla base, non dovrebbe risultare difficile applicarla con relativa semplicità.

Poniamo il caso che abbiamo queste direttive nel nostro file .htaccess:

<Directory "/www">
    Order Deny,Allow
    Deny from all
    Allow from 192.168.0.100 123.456.
    Allow from example.org example.com
    Allow from foo.example.
</Directory>

Quello su cui questo post si concentra è la riga che inizia con Order. Questa direttiva dice ad Apache in quale ordine deve applicare le successive direttive Deny e Allow, vale a dire se prima l’una o l’altra. Nel caso in esempio, l’ordine è prima quelle Deny e poi quelle Allow. L’ordine è importante perché in Apache l’ultima direttiva ha priorità sulle precedenti.

Detta in modo semplice quelle righe significano:

  • nega (Deny) a tutti l’accesso alla directory /www;
  • permettilo (Allow) a chi proviene dall’indirizzo IP 192.168.0.100 e a chi abbia indirizzo IP che comincia con 123.456.;
  • permettilo (Allow) a chi proviene dal dominio example.org o da example.com;
  • permettilo (Allow) a chi proviene dal dominio foo.example. di qualsiasi TLD.

Se, invece, invertissimo l’ordine della direttiva Order da Order Deny,Allow a Order Allow,Deny, l’effetto sarebbe di bloccare tutti. Avremmo infatti che Apache leggerebbe così:

  • permetti l’accesso all’indirizzo IP 192.168.0.100 e a chi abbia…;
  • permetti l’accesso al dominio example.org…;
  • ecc…
  • nega a tutti l’accesso.

La regola finale avrebbe la prevalenza sulle precedenti, finendo così per bloccare tutti.

L’ordine con cui le direttive sono scritte nel blocco di codice non ha invece alcuna influenza.2 Potremmo anche scriverle così:

<Directory "/www">
    Order Deny,Allow
    Allow from 192.168.0.100 123.456.
    Allow from example.org example.com
    Deny from all
    Allow from foo.example.
</Directory>

In ogni caso Apache leggerà e applicherà in blocco prima tutte le direttive Deny e poi tutte quelle Allow.

In linea generale, Jeff Starr3 consiglia di tenere queste due regole di base:

  1. Quando si vogliono bloccare specifici indirizzi, usare Order Allow,Deny, quindi la direttiva Allow from all e a seguire le direttive Deny from .... Ad esempio:

    <Directory "/www">
        Order Allow,Deny
        Allow from all
        Deny from 192.168.0.100
    </Directory>
    
  2. Quando si vogliono permettere specifici indirizzi, usare Order Deny,Allow, quindi la direttiva Deny from all e a seguire le direttive Allow from .... Ad esempio:

    <Directory "/www">
        Order Deny,Allow
        Deny from all
        Allow from 192.168.0.100
    </Directory>
    

Fonti:


  1. «Getting the order and syntax of these directives is critical to their operation». Jeff Starr, .htaccess made easy, Perishable Press Books, aprile 2023, p. 123. ↩︎

  2. «The order in which lines appear in the configuration files is not significant — all Allow lines are processed as one group, all Deny lines are considered as another, and the default state is considered by itself». Cfr. The Apache Software Foundation, Apache Module mod_access_compat, par. “Order Directive”. ↩︎

  3. Jeff Starr, op. cit., p. 123. ↩︎