2013-09-23 4 views
1

Nous utilisons actuellement un resizer d'image qui a été écrit en PHP. Le script de redimensionnement tire parti de la mise en cache et écrit les images redimensionnées générées dans un répertoire de cache (judicieusement nommé cache/).RewriteRule basé sur l'existence d'un fichier avec un autre nom

Le processus est telle qu'une URL réécrite, par exemple:
domain.com/img/250x250/some-image.jpg

sera réécrite à:
domain.com/image.php?width=250&height=250&src=some-image.jpg&function=resizeCrop

intérieur image.php, nous faisons un chèque pour voir si un fichier de correspondances le redimensionnement dans le répertoire cache/. Toutes les images mises en cache sont stockées avec un nom de cachFunctionWidth_height_originalName, donc pour l'exemple donné le fichier d'image générée à l'intérieur cache/ seraient nommés resizecrop250_250_some-image.jpg

Pour le moment, nous en utilisant la fonction de PHP fpassthru() pour sortir le fichier dans le navigateur si existe. Si ce n'est pas le cas, nous utilisons une combinaison de fonctions GD et d'algorithmes pour afficher le fichier dans le navigateur.

Ma question est de savoir s'il nous sera possible de contourner complètement le image.php si une image redimensionnée existe dans le répertoire cache en utilisant HTACCESS (c'est un serveur Linux). Essentiellement, nous devons vérifier un formulaire de nom bastardized avant de servir la réécriture.

Par exemple, voici quelques pseudo-code de ce que nous aimerions réaliser, mais je ne pense pas qu'il soit possible:

  • demande le fichier utilisateur> domain.com/img/250x250/some- image.jpg
  • Vérifiez si le fichier existe cache/resizecrop250_250_some-image.jpg
  • Si elle ne, récrire à cache/resizecrop250_250_some-image.jpg
  • Si elle n'a pas, pour récrire domain.com/image.php?width=250&height=250&src=some-image.jpg&function=resizeCrop

Si cela n'est pas possible via HTACCESS, toute autre suggestion serait la bienvenue.

+0

'nous faisons un contrôle pour voir si un fichier correspond à la Redimensionner dans le cache /' pourquoi n'est pas '/ img/250x250/some-image.jpg' l'emplacement du fichier mis en cache? l'utilisation de php au lieu de no-php est presque certainement une solution sous-optimale à moins qu'il y ait une exigence non-mentionnée – AD7six

Répondre

2

Je crois qu'en utilisant mod_rewrite c'est possible. Règle suivante considérons comme:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

# check if constructed image name exists in cache directory  
RewriteCond %{DOCUMENT_ROOT}/cache/resizecrop$1_$2_$3 -f 
# exists, redirect to cache/constructed-image-file-name 
RewriteRule ^img/([0-9]+)x([0-9]+)/([^.]+\.(?:jpe?g|gif|bmp|png))$ /cache/resizecrop$1_$2_$3 [L,NC] 

# doesn't exist then forward to image.php with required query parameters 
RewriteRule ^img/([0-9]+)x([0-9]+)/([^.]+\.(?:jpe?g|gif|bmp|png))$ /image.php?width=$1&height=$2&src=$3&function=resizeCrop [L,NC] 
+0

Merci, c'est une excellente solution et juste ce que nous cherchions! – BenM

+0

Vous êtes le bienvenu, heureux que cela a fonctionné pour vous. – anubhava

Questions connexes