Drupal e files: private vs. public



ritratto di dbanchero

Premessa: questa tips è stata testata con Drupal 5 ma credo che si possa applicare senza difficoltà anche su Drupal 6 (e in linea di principio su qualunque CMS).

Problema: ho una dir in cui ci sono una serie di files il cui accesso è regolamentato da diversi vincoli. Non voglio che i miei files siano visibili direttamente mettendo la url nel browser.

Soluzione:

  • nella dir che voglio proteggere (per esempio files) metto nel file .htaccess le seguenti direttive:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /system/files
RewriteRule ^(.*)$ $1 [L,R=301]
</IfModule>

  • in questo modo intercetto qualunque richiesta fatta direttamente via browser a www.esempio.it/files
  • in Home › Amministra › Configurazione del sito: scelgo il flag public (in questo modo non demandiamo più a drupal il controllo ma ci assumiamo noi al responsabilità del download dei files)
  • ora non basta che realizzare un piccolo modulo che sfrutta lo hook_file_download, per esempio:

function miomodulo_file_download($file) {
    global $user;
   
    if ($user->uid == 1 || in_array('esempio', $user->roles)) {
        return array('Pragma:no-cache', 'Cache-control:private', 'Content-type:' . 'application/octet-stream');
    } else {
        return -1;
    }   
}

  • ovviamente, in questo punto, si possono complicare a piacere le regole di accesso.