web-dev-qa-db-fra.com

W3 Total Cache, Fichiers Cloud RackSpace et Forcing Téléchargements

J'utilise la connexion CDN de W3 Total Cache à RackSpace CloudFiles pour servir plusieurs centaines de fichiers multimédias. Mon objectif est de télécharger les fichiers dans le navigateur de l'utilisateur plutôt que de les diffuser. Selon la documentation CloudFiles (http://docs.rackspacecloud.com/files/api/v1/cf-devguide-20111115.pdf), je peux définir les en-têtes de disposition du contenu.

Est-ce que quelqu'un sait comment cela peut être fait via W3 Total Cache ou, peut-être, avec? Ou encore, connaissez-vous un autre moyen de forcer les téléchargements pour les fichiers servis via le CDN?

4
Jonathan Wold

Cela peut être décomposé en une tâche simple en ajoutant un filtre personnalisé.

Vous devrez ajouter ce qui suit à la méthode _send_request de la classe CF_Http dans la ligne 1283 de cloudfiles_http.php.

$headers = $this->_make_headers($hdrs);
//Add this line below
$headers = apply_filters('cloudfiles_headers', $headers, $url_path, $method);

Cela vous donnera accès aux en-têtes d'un plugin plutôt que de faire de grandes modifications à W3TC.

Dans votre plugin, vous pouvez créer une fonction comme celle-ci:

add_filter('cloudfiles_headers', 'wpse_42273_cloudfiles_headers', 0, 3);
function wpse_42273_cloudfiles_headers($headers, $url_path, $method){
    if($method != 'GET')
         return $headers;
    if(preg_match_all('~^.*/(.+\.(jpg|jpeg|png|gif|pdf|doc|docx|csv))$~i', $url_path, $matches)){
        $filename = $matches[1][0];
        $headers[] = "Content-Disposition: attachment; filename=$filename";
    }
    return $headers;
}

Cela ajoutera l'en-tête approprié pour forcer le téléchargement si W3TC récupère un objet avec une extension de fichier répertoriée dans la regex ci-dessus. C'est un bon moyen de contrôler quels fichiers sont servis dans le navigateur et quels fichiers doivent être téléchargés.

Vous pouvez essayer ceci dans un plugin que j'ai créé pour votre commodité. Cela nécessitera peut-être quelques ajustements, mais j’ai le sentiment que vous devriez aborder la question.

Téléchargez le plugin ici: http://3-3.me/K4SL

Pour finir, ceci édite évidemment le noyau du plugin W3TC (bien qu’avec une seule ligne de code). Ce n'est pas une pratique exemplaire, mais cela fonctionnera pour vous. Cela signifie que toute mise à niveau annulera vos modifications. Il peut être prudent de renommer le plugin (créer un fork pour votre système) afin que WordPress n'essaye pas de le mettre à jour.

J'espère que cela vous aide!

6
Brian Fegter