Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Serveurs (Apache, IIS,...) > Apache
Apache Forum d'entraide Apache. Avant de poster : Cours Apache, FAQ Apache
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/07/2011, 22h04   #1
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
Par défaut URL rewriting, une énigme!

Bonjour,

J'essaye en vain d'utiliser l'url rewriting sur mon site web. J'aimerais réécrire les adresses simplement, si possible en insérant les mots clés de mes news dans l'adresse de la page "detail.php" sur la barre d'adresse (je ne sais pas comment faire ça). J'aimerais aussi ne pas avoir à modifier les liens dans mes fichiers php, si un fichier htaccess suffit c'est génial! Je suis hébergé par "bluehost".

Mon acharnement vise à transformer les types d'adresses suivantes:

index.php?page=2
index.php?page=2&tri=asc
index.php?page=2&tri=desc

index.php?stat=comment
index.php?page=2&stat=comment

index.php?stat=like
index.php?page=2&stat=like

detail.php?news=22
account.php?pseudo=Yopla

Voici la tête de mon fichier .htaccess:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#--------------------------------------------------
# Répertoire : /www/
#--------------------------------------------------

# Le serveur doit suivre les liens symboliques :
3Options +FollowSymlinks

# Activation du module de réécriture d'URL (!!!mettre à on):
RewriteEngine off

#--------------------------------------------------
# Règles de réécriture d'URL :
#--------------------------------------------------

# Article sans numéro de page :
#RewriteRule ^news-([0-9]+)\.html$   /detail.php?news=$1 [QSA,L]

# Index avec numéro de page : index-2.html
#RewriteRule ^index-(.*)\.html$ /index.php?page=$1 [QSA,L]

# Index avec numéro de page et tri : index-2-asc.html
#RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&tri=$2 [QSA,L]
Merci beaucoup pour votre aide, je suis nouveau dans le domaine et autodidacte
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 15h03   #2
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 285
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 285
Points : 8 570
Points : 8 570
A part le fait qu'il faut décommenter (activer) les règles, je ne vois pas de problème. C'est quoi le souci ?

Pour la modification des liens dans les pages, c'est dommage, va falloir que tu t'y mettes Apache ne le fera pas pour toi sauf à utiliser des redirections inavouables ou mod_proxy_html mais je doute que ce soit possible chez ton hébergeur et ce n'est pas beau non plus.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 22h20   #3
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
Merci pour ta réponse. Je vais exposer mon problème par étapes.

Le scénario est le suivant:

J'ai une page index.php qui regroupe plusieurs news. En bas de la page, il y a des numéros de page pour voir les news plus anciennes. Toujours sur cette page d'index, on peut trier les news suivant le nombre de commentaires qu'elles ont reçues, ou bien le nombre de "like".

A l'heure actuelle, quand je clique sur les liens de page en bas de "index.php", je tombe sur la deuxième page: index-2.html . Si je clique sur le lien "1", je tombe sur index-1.html. Parfait.

Ca se corse quand je clique sur le lien "Les plus commentées". En faisant ça, je tombe sur "index-stat-comment.html". Parfait et ça marche indéfiniment. Je vais en bas de page, je clique sur le lien pour me rendre à la page 2 et je tombe sur "index-2-comment.html". Toujours parfait.

Le problème, c'est que si je clique maintenant sur le lien 1 pour retomber sur la première page (contenant les news les plus commentées), je tombe sur:
index-1.html au lieu de index-1-comment.html!


Ca doit être une histoire de $_GET qui m'échappe complètement. Pouvez-vous m'aider?

Pour info le htaccess actuel:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Options +FollowSymlinks

#--------------------------------------------------
# Répertoire : /www/
#--------------------------------------------------

# Le serveur doit suivre les liens symboliques : Options +FollowSymlinks


# Activation du module de réécriture d'URL (!!!mettre à on):
RewriteEngine on

#--------------------------------------------------
# Règles de réécriture d'URL :
#--------------------------------------------------

# Article sans numéro de page :
RewriteRule ^news-([0-9]+)\.html$   /detail.php?news=$1 [QSA,L]

# Index avec juste un tri par commentaires ou like: index-comment.html !!!!!
RewriteRule ^index-stat-(.*)\.html$ /index.php?stat=$1 [QSA,L]

# Index avec numéro de page : index-2.html
RewriteRule ^index-(.*)\.html$ /index.php?page=$1 [QSA,L]

# Index avec numéro de page et tri : index-2-asc.html
RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&tri=$2 [QSA,L]

# Index avec numéro de page et stat : index-2-comment.html
RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&stat=$2 [QSA,L]
Et le script qui génère les liens vers les pages de news:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//création des liens vers les pages de news 
	
if(isset($_GET['tri']))
	$tri = '-' . $_GET['tri'] . '.html';
else
	$tri = '.html';
		
if(isset($_GET['stat']))
	$stat = '-' . $_GET['stat'];
else
	$stat = '';
			
echo '<p class=\'nav_center\'>Page : ';

for($numeroPage = 1; $numeroPage <= $nombreDePages; $numeroPage++)  
{
	if($page === $numeroPage)
	{
		echo ' [<strong>'.$page.'</strong>] ';
	}
	else
		echo '<a href="index-' . $numeroPage . '' . $stat . '' . $tri .'">' . $numeroPage . '</a>&nbsp;';
}
echo '</p>';
Merci beaucoup à vous!
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 12h22   #4
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 285
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 285
Points : 8 570
Points : 8 570
Ce que je vais dire n'a peut-être aucun rapport avec le problème car je n'ai pas lu le code PHP mais il y a un "problème de conception" avec le .htaccess. Les lignes en cause :
Code :
1
2
3
4
5
6
7
8
# Index avec numéro de page : index-2.html
RewriteRule ^index-(.*)\.html$ /index.php?page=$1 [QSA,L]

# Index avec numéro de page et tri : index-2-asc.html
RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&tri=$2 [QSA,L]

# Index avec numéro de page et stat : index-2-comment.html
RewriteRule ^index-(.*)-(.*)\.html$ /index.php?page=$1&stat=$2 [QSA,L]
Le problème c'est que :
  • Avec ce fichier, les 2 dernières règles ne sont jamais activées car le filtre de la première règle "^index-(.*)\.html$" englobe les filtres des deux autres règles. Donc on se retrouve toujours avec la seule première règle qui est activée, donc une query string qui ne contient jamais que le paramètre page.
  • Quand bien même le premier problème n'existerait pas, la dernière ligne n'est jamais activée car son filtre est strictement identique à la règle précédente.
Je propose donc de commencer par mettre la première de ces 3 règles (celle avec le filtre "^index-(.*)\.html$") tout en bas du fichier.
Pour le problème des 2 règles avec le même filtre, je te laisse nous expliquer la raison et dire comment construire des filtres plus précis.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 17h52   #5
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
Merci pour tes conseils, ça a résolu mes problèmes!

J'ai presque terminé l'url rewriting mais pour la page des catégories il y a un plantage (call to a function fetch on a non object).

L'url de départ est du style:

categorie.php?name=Vid%26eacute%3Bos

Je pense que c'est le nom de la catégorie que le fichier htaccess ne reconnait pas. Une idée?

Ah oui aussi, j'aimerais que l'internaute ne voie jamais index.php mais plutôt qu'il voie www.monsite.com et je cherche une solution à implémenter dans le htaccess sans devoir indiquer www.monsite.com car le site que je développe pourra servir à d'autres et j'essaye de dépersonnaliser le code.
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 21h39   #6
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 285
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 285
Points : 8 570
Points : 8 570
Rien compris à ton histoire de catégorie : où est-ce que tu parles de catégorie dans tout ce qui précède ? C'est quoi l'URL demandée et pourquoi dis-tu qu'Apache ne reconnaît pas le nom de la catégorie ?

Je ne comprends pas non plus la seconde question : où est-ce que le visiteur voit index.php dans l'URL ?
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2011, 22h13   #7
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
J'avais oublié de le préciser, mais sur mon site il y a aussi des catégories de news (des sections): vidéos,musique,... et donc quand je clique sur le lien "vidéos" je tombe sur la page section.php?name=Vid%26eacute%3Bos

Je veux la réécrire à l'aide du .htaccess pour obtenir ce type d'url:

http://www.monsite.com/section-name-...cute%3Bos.html

Pour ce faire, j'insère la ligne:

Code :
RewriteRule ^section-name-(.*)\.html$ /section.php?name=$1 [QSA,L]
Mais quand je tape directement l'adresse réécrite http://www.monsite.com/section-name-...cute%3Bos.html dans la barre d'adresse, j'obtiens une erreur:

Citation:
Fatal error: Call to a member function fetchAll() on a non-object
D'ailleurs sur la page qui s'affiche, à la place du titre de la section "Vid%26eacute%3Bos" décodé de l'UTF8 donc "Vidéos", il est affiché "Vid". A croire que le htaccess n'a pas tenu compte des caractères "%26eacute%3Bos". Par conséquent, quand je récupère l'id de la catégorie à partir de son nom tronqué, sql ne renvoie rien de bon et j'ai un erreur à cet endroit du code:

Code :
1
2
$sth = $dbh->query($sql);
$result = $sth->fetchAll();
...alors que ça fonctionne sans la réécriture d'url.

Pour passer les noms des catégories via l'URL j'encode les chaînes de caractères en UTF8 ce qui transforme les accents et supprime les espaces et c'est toujours reconvertissable en la chaine d'origine. Je n'arrivais pas à faire fonctionner les htmlentities()...

Pour la seconde question, quand un visiteur se rend sur mon site il voit www.monsite.com/index.php

Je voudrais qu'il ne voie que www.monsite.com, qu'il ne sache pas que c'est fait en php.

C'est plus clair maintenant?

Merci!
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 10h17   #8
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 285
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 285
Points : 8 570
Points : 8 570
Il faut savoir deux choses :
  • l'encodage HTML n'est pas le même que l'encodage URL : en HTML, é se traduit en &eacute; alors qu'en URL il se traduit pas %E9.
  • mod_rewrite ne change pas le code HTML qui est renvoyé au navigateur. Là, visiblement, c'est le code HTML reçu par le navigateur qui contient un lien avec un mauvais encodage du é. Donc la première chose que je ferai c'est regardé le code HTML reçu par le navigateur. Si le lien est bien
    Code html :
    <a href="/section-name-Vid%26eacute%3Bos.html">
    c'est qu'il y a un problème avec le code PHP qui génère ce lien, pas Apache.

En revanche, côté Apache, ce qu'il faut c'est que la bonne URL avec %E9 (/section-name-Vid%E9os.html) renvoie le bon résultat.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 23h28   #9
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
Merci beaucoup pour ta réponse J'ai passé la soirée à essayer de changer les encodages de catégories de news mais je m'y retrouve vraiment pas.

Pourrais-tu me donner des conseils sur les fonctions à utiliser dans l'ordre pour encoder le nom de la catégorie de news en BDD et puis ce qu'il faut faire pour décoder et transmettre le nom par un $_GET, et enfin comment retraiter ce nom du $_GET pour le comparer au nom stocké en BDD et ainsi récupérer toutes les news dont l'id correspond au nom qu'on cherche.

J'ai vraiment cherché mais je patauge avec les htmlentities,addslashes,utf8 encode, urlencode etc.

Merci beaucoup
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/07/2011, 23h43   #10
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 285
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 285
Points : 8 570
Points : 8 570
A la limite, pour calculer les URL (le <a href>), je ne ferais rien du tout : je récupèrerais ce qu'il y a en base de données directement pour construire l'URL sans l'encodée. C'est le navigateur qui se chargera ensuite d'encoder "comme il faut". Au pire, il ne faut utiliser que urlencode.

En fait, il faut que tu stockes en base de données la donnée non encodée (avec un é) ou nettoyée (tu remplaces les é par des e, etc.) pour s'affranchir des problèmes d'encodage. Ce qu'il faut ensuite c'est s'assurer partout (base de données, encodage des fichiers PHP, content type renvoyé par le serveur, code HTML) que tu utilises ne même encodage. Comme ça, tu t'affranchiras des risques de transcodage pour passer d'un encodage à un autre. Si tu dois faire des bricoles pour emboîter dans un ordre bien précis les fonctions que tu cites, tu vas trop loin.
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2011, 01h11   #11
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
Salut,

Merci Je suis assez fatigué alors je vais répondre vite et revenir après avoir dormi. J'ai réussi, enfin je pense! J'ai simplifié comme tu l'as suggéré mais j'ai quand-meme utilisé urlencode et decode.

Avec l'url rewriting j'obtiens un lien "a href" de la catégorie:

www.monsite.com/section-name-%E9t%E9+am%E8re+d%5C%27ao%FBt.html

Dis-moi si ça te semble bon.

Les news s'affichent bien dans la catégorie voulue.

Ps: la catégorie de l'exemple est "été amère d'août", ne veut rien dire mais c'est pour les accents.

Par contre après avoir récupéré le lien de la catégorie par $_GET (et passé à urlencode()) j'ai vu /// que j'ai dû supprimer de la chaîne par deux stripslashes successifs:

Code PHP :
1
2
3
4
5
		$name = $_GET['name'];
		$section = urldecode($name);
		$comparerAvecBDD = $section;
		$nom_rubrique = stripslashes($section);
		$nom_rubrique = stripslashes($nom_rubrique);

Ce /// est une énigme pour moi
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2011, 14h48   #12
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 285
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 285
Points : 8 570
Points : 8 570
Citation:
Envoyé par Sébastien L Voir le message
Avec l'url rewriting j'obtiens un lien "a href" de la catégorie:

www.monsite.com/section-name-%E9t%E9+am%E8re+d%5C%27ao%FBt.html

Dis-moi si ça te semble bon.
Oui, c'est correct.

Citation:
Envoyé par Sébastien L Voir le message
Par contre après avoir récupéré le lien de la catégorie par $_GET (et passé à urlencode()) j'ai vu /// que j'ai dû supprimer de la chaîne par deux stripslashes successifs
Moi aussi. Logiquement, tu ne devrais pas avoir besoin d'urldecode : que vaut $_GET['name'] ?
__________________

Du détail, du détail, du détail !!!
Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 14h50   #13
Candidat au titre de Membre du Club
 
Inscription : février 2006
Messages : 54
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 54
Points : 13
Points : 13
Salut,

C'est bizarre, j'ai accès aux différentes catégories sur le site en ligne (donc par ex http://www.monsite.com/categorie-%E9...%27ao%FBt.html) mais ça ne fonctionne pas en local dès qu'il y a des accents! (mais www.monsite.com/categorie-maison+blanche.html fonctionne en local avec Wampserver). Rewrite rule est activé dans les paramètres Apache. J'aimerais vraiment avoir un accès local car pour le moment je tombe sur une erreur 403:

Citation:
Forbidden

You don't have permission to access /categorie-été+amère+d'août.html on this server.
Edit: Voilà ce que donne $_GET['name'] sur la chaîne visible dans la barre d'adresse (/categorie-%E9t%E9+am%E8re+d%5C%27ao%FBt.html)...c'est un var_dump($_GET['name']):

string(19) "été amère d\\\'août"

Merci pour ton aide

EDIT 27 juillet: Le problème est résolu Il fallait tout mettre en UTF8...

En tout cas un tout grand merci pour ton aide
Sébastien L est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h31.


 
 
 
 
Partenaires

Hébergement Web