Redirection images

Nouveau WRInaute
Bonjour,

Quelqu'un peut me renseigner sur ce problème de redirection sur lequel je m'arrache les cheveux depuis deux jours ?

Voilà le problème : sur le site d'un ami, il a environ 300 images situées dans un dossier "images" et qui étaient nommées 01.jpg, 02.jpg, .... 300.jpg
Pour améliorer le référencement de ces images, nous leur avons donné des noms plus parlant tout en conservant leur numéro (ex: soleil-01.jpg, neptune-02.jpg, ..... saturne-300.jpg). Le dossier les contenant étant devenu "images-science"

Afin que les anciens liens vers ces images aboutissent toujours à elles, nous avons ajouté pour ces 300 images les redirections du type
Code:
RedirectPermanent /images/01.jpg /images-science/soleil-01.jpg
dans un htaccess à la racine du site et ça fonctionne parfaitement.

Le souci c'est que ledit htaccess comporte maintenant quelques 350 lignes et nous cherchons un moyen de réduire sa taille.
Ayant découvert les expressions régulières (il y a 2 jours :oops: ) j'ai essayé l'expression suivante et quelques variantes mais sans autre résultat qu'une Erreur 404.
Code:
RewriteRule ^images/([0-9]{2})\.jpg$ /images-science/(.*)-$1.jpg  [L]

Ce que je voudrais c'est que par exemple /images/01.jpg soit redirigée vers /images-science/soleil-01.jpg et puisque la variable $1 nous donne le numero de l'image, comment rediriger cette image vers /images-science/n'importe quelle suite de caractères terminée par le numéro d'image.jpg ?



Merci
 
WRInaute occasionnel
Exact, et pour ajouter un précis à ce que te dit Leonick :

premier code :
Code:
RedirectPermanent /images/01.jpg /images-science/soleil-01.jpg

Code:
RewriteRule ^images/([0-9]{2})\.jpg$ /images-science/(.*)-$1.jpg  [L]

Dans le second code, tu demandes à ce que : images/([0-9]{2})\.jpg (donc que ce qui appelle images/XX.jpg )
soit redirigé vers :
images-science/(toute chaine de caractère)-XX.jpg.

Par logique, cela voudrait dire, rediriges vers /images-science/, jusque là OK
XX.jpg OK aussi
mais (.*) signifie n'importe qu'elle chaine de caractère, ok mais laquelle ???? le htaccess ne va pas te créer une chaine de caractères.

Pour faire plus imagé, un aveugle te demandes son chemin, et tu lui dis :" c'est par là !!!". C'est bien mais il est aveugle, il ne voit pas ce que tu lui montres, tu dois lui dire, 500m à gauche pour qu'il puisse y aller.

Ton htacces, c'est pareil, le chemin de destination doit être précis, tu peux lui passer un paramètre, $1 ici qui vient de l'URL source, mais le reste doit être précis.

En espérant que ce petit explicatif t'aie permis de comprendre :wink:
 
Nouveau WRInaute
Merci pour vos réponses,

En fait je m'en doutais un peu, mais vu que je viens à peine de découvrir les regex, je m'étais dit qu'il y avait quelque chose à faire avec ça. Je suis très déçu après avoir lu ici et là que ces fonctions étaient TRES puissantes, bah pour la première application que je veux en faire, c'est pas possible !!!

Ok, je comprend que ça a des limites mais s'il est possible de faire toutes sortes de tris dans les chaines de caractères, y compris d'ignorer une partie de celles ci, je pense que ceux qui ont inventé ça auraient pu prévoir le cas que je soulève.

Tant pis.

Merci quand même.
 
WRInaute occasionnel
Oui et non,

tu peux dire à ton htaccess, si tu trouves images/[peut importe quoi].jpg tu le renvois vers
images-sciences/[le meme nimporte quoi].jpg

"Prend une chose rouge et fais en un truc rouge"

Avec seulement ça, est ce que tu savais que je voulais que tu me fasses, à partir d'un morceau de tissu rouge, des mouffles avec un doigt séparé, en laine, et rouge ?

"je pense à quelque chose, qu'est ce que c'est ?"

Dans ton htaccess, c'est la même, tu captes ce que tu demandes à ton htaccess ??? tu lui demandes de choisir pour toi

avec ton :
RewriteRule ^images/([0-9]{2})\.jpg$ /images-science/(.*)-$1.jpg [L]

il pourrait te sortir :
/images-science/soleil-01.jpg
/images-science/mercure-01.jpg
/images-science/venus-01.jpg
/images-science/mon-voisin-dupont-01.jpg (parce qu'il est dans la lune)

Le htaccess ne décide pas pour toi, tu lui donnes un ordre qu'il exécute, lui ne prend pas de décision ...

Avec tous ces jolis exemples imagés, là quand même :D
 
Nouveau WRInaute
Ok Djibou,

J'ai bien compris ce que tu expliques à savoir que le htacces ne peut pas deviner ce que je veux faire. Je déplore seulement que les programmeurs qui ont pondu ces fonctions n'ont pas prévu le cas qui m'intéresse. Car si c'était possible, les webmasters auraient toute latitude pour renommer leurs pages ou images ou autres avec une souplesse quasi illimitée. Imagine que tu puisses renommer ces éléments disons chaque semaine, ça te permettrait d'optimiser ton référencement de façon hyper pointu et totalement transparent pour tes visiteurs... mais bon il est toujours permis de rêver :roll:
 
WRInaute occasionnel
Je comprends,
mais le htaccess est, et il ne faut pas l'oublier, avant tout une extension de la configuration du serveur....

Si on pouvait faire tout ce que l'on voulait avec, j'imagine même pas les conséquences catastrophiques.... parce qu'en dédié, ça va encore, mais en mutualisé, t'imagines ???

Sinon, pourquoi ne remplaces tu pas directement les URLs de tes images dans le code HTML ?

ça ne serait pas le plus simple, parce que faire manger 200 et quelques lignes au htaccess rien que pour des images, c'est quand même moyen... non ?

Allez bon courage :wink:
 
Nouveau WRInaute
Djibou,

Le remplacement des URLs a été fait dans le HTML de tout le site mais les liens vers ces images depuis d'autres sites ne fonctionneraient pas sans redirection. Ces images sont les images référence d'un livre dont le site fait la promotion et il est très important qu'elles soient disponibles en permanence et dans tous les cas.

Le problème est que le créateur du site n'a pas "pensé référencement" lors de son lancement depuis une dizaine d'années déjà. Pour te donner une idée, les pages HTML étaient nommées comme les images (page01.html, page02.html, etc ...)

Pour le moment le serveur suit la cadence avec ce htaccess de 350 lignes mais je me demande ce qu'il adviendrait si le traffic du site montait soudainement en flèche... c'est ce que j'essaye d'anticiper :wink:
 
WRInaute occasionnel
Encore que 350 lignes ça va, mais bon, au pire il faudra basculer sur un dédié, ou une plus grosse config.

Dis toi une chose : à chaque appel fait sur le serveur, le htaccess est appelé :
tu appelles une image, il va lire le htaccess,
tu appelles un css, il va lire le htaccess,
js idem,
html idem,
etc.
 
Nouveau WRInaute
Oui c'est bien pour ça que je cherche à alléger ce htaccess.

Je viens de penser à un truc : ne serait-il pas possible (peut-être avec un RewriteCond) de tester l'existence de /images-science/soleil-01.jpg et de récupérer ainsi soleil dans une variable afin de réinjecter celle-ci dans la RewriteRule ?

Excusez si ma question est idiote mais je découvre à peine les regex :)
 
WRInaute accro
Biloubou a dit:
Je déplore seulement que les programmeurs qui ont pondu ces fonctions n'ont pas prévu le cas qui m'intéresse. Car si c'était possible, les webmasters auraient toute latitude pour renommer leurs pages ou images ou autres avec une souplesse quasi illimitée.
et alors ? ils l'ont cette latitude : c'est au niveau de ton programme de gérer tout ça. En fait, comme beaucoup de personnes qui se mettent sur le tard à la réécriture d'url, tu essaies d'utiliser le htaccess dans le sens inverse de celui pour lequel il a été créé, normalement, il fait passer une url plein texte, avec souvent un id, en url avec des paramètres, pas le contraire
 
WRInaute accro
pour moins te prendre la tête, il te suffit de garder aussi les anciennes images accessibles, en plus de celles avec les nouveaux noms, comme ça tout serait accessible
 
Nouveau WRInaute
et alors ? ils l'ont cette latitude : c'est au niveau de ton programme de gérer tout ça. En fait, comme beaucoup de personnes qui se mettent sur le tard à la réécriture d'url, tu essaies d'utiliser le htaccess dans le sens inverse de celui pour lequel il a été créé, normalement, il fait passer une url plein texte, avec souvent un id, en url avec des paramètres, pas le contraire

Bien qu'effectivement je ne sois pas expert en réécriture d'url (loin de là ! :mrgreen: ), je ne partage pas ton avis. Je pense que ces fonctions de réécriture d'url ne sont pas universelles compte tenu, comme tu le dis, qu'elles ont été conçues pour un usage strict, rigide même je dirais. La preuve c'est que dans mon cas, je suis amené à contourner cette limite en faisant, par exemple et comme tu le suggères, cohabiter les deux séries d'images. C'est pas très propre comme solution mais c'est effectivement une solution.
Et figure toi que c'est tellement évident que je n'y avais même pas pensé :oops:
Mais celà ne risque t-il pas d'être considéré comme "duplicate content" même si c'est des images ?

En tous cas merci de t'être penché sur mon problème Leonick.
 
WRInaute accro
il y a un moyen "simple" de gére ça, mais il te faut passer par un script php.

tu redirige avec ton htaccess toutes les url de tes vieilles images en XX.jpg vers un script php unique, qui lui via une logique interne (accès base / fichier) et une logique programme renvoie l'image.

a titre d'exemple voici ce que je fais dans un cas similaire afin de renvoyer une miniature de l'image d'origine :

# traitement des miniatures
RewriteCond %{REQUEST_URI} ^(.*)thumb.*
RewriteRule ^(.*)thumb(.*)$ /images/images.php?data=$2 [L]

Dans mon cas le fait d'avoir la chaine "thumb" est signe que l'on désire une miniature dans le dossier image.
les urls qui peuvent se rencontrer sont sous la forme -http://www.example.com/images/thumb/190/mon-image.jpg
dans cet exemple 190 est la taille désirée.

Le script php 'image.php' qui gère le truc et qui est appelé via le htaccess est sous cette forme :

Code:
<?php
	$format = eregi_replace("^.","",$_GET['data']); 
	$format = eregi_replace("/.*$","",$format); 
	$fichier = eregi_replace("^/${format}","",$_GET['data']);
	$fichier = $_SERVER['DOCUMENT_ROOT'].'/images'.$fichier;
	
	// header php
	$offset = 290304000;
	$expire = gmdate ("D, d M Y H:i:s", time() + $offset) . " GMT";
	header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
	header("Cache-Control: max-age=$offset, public");
	header("expires: ".$expire);
	header('Content-Type: image/jpeg');

	try {
		// Calcul des nouvelles dimensions
		list($width, $height) = getimagesize($fichier);
		$facteur = $width / $format;
		$newwidth = $width / $facteur;
		$newheight = $height / $facteur;
		
		// Chargement
		$thumb = imagecreatetruecolor($newwidth, $newheight);
		$source = imagecreatefromjpeg($fichier);
		
		// Re-dimensionnement
		imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
		
		// Affichage
		imagejpeg($thumb);
	}catch (Exception $e) {
    		$handle = fopen($fichier, "rb");
		$contents = fread($handle, filesize($fichier));
		fclose($handle);
		echo $contents;
	}		
?>

Bien sur c'est pas ce que tu cherche mais c'est juste pour t'illustrer un exemple ou du code php gère une bidouille sur une image via un htaccess.
A noter: si la retaille de l'image échoue, c'est l'image d'origine qui est envoyée.
 
WRInaute accro
+1 pour la solution de zeb, qui permet de faire les choses finement sans avoir à accumuler les règles dans le fichier .htaccess. Je suis en train de refaire de A à Z un site qui est actuellement localisé dans un sous-dossier, et j'envisage bien de tout gérer de cette manière, niveau redirection, que ce soit les pages ou les images.
 
Nouveau WRInaute
Bah ça fait une deuxième solution à mon problème :P

Cette dernière solution, j'y ai pensé cette après midi et voilà qu'on me la sert maintenant sur un plateau :D
Je n'ai plus qu'à m'inspirer du script de zeb et le tour est joué, trop cool !!!

Vraiment un grand merci à vous, ça faisait 3 jours que je me prenais la tête. :wink:
 
Nouveau WRInaute
Bonjour,

Pour que ça puisse servir à d'autres personnes, je met ici la solution en suivant les conseils qui m'ont été donnés.
Code:
RewriteRule ^(images/|figure/|planche/)([0-9]{2,2})\.jpg$ http://www.mondomaine.com/images-science/images.php?num=$2 [R=301,L]

et le fichier images.php qui "traduit" les noms d'image :

Code:
<?
$NumeroImage = $_GET['num'];

if($NumeroImage != "" )
	{
	$liste = "\n";
	$liste .= "soleil-01.jpg\n";
	$liste .= "uranus-02.jpg\n";
	$liste .= "saturne-03.jpg\n";
	...
	...
	...
	$liste .= "jupiter-299.jpg\n";
	$liste .= "neptune-300.jpg\n";
		
	$RegEx = "#\n(.*)" . $NumeroImage . "\.jpg\n#";
	preg_match($RegEx,$liste,$matches);

	header("Location: http://www.mondomaine.com/images-science/".trim($matches[0]));
	}
else
	{
	print("<html><head><title>Image non trouvée !</title></head><body>\n");
	print("L'image que vous demandez n'existe pas. Si vous voulez voir toutes les images du livre, c'est <a href=\"../planche/figures.php\">ici</a></body></html>\n");
	}
?>
 
Discussions similaires
Haut