IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

[Rewriting] Supprimer l'id dans l'adresse


Sujet :

Apache

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut [Rewriting] Supprimer l'id dans l'adresse
    Bonjour,

    On me demande pour mon stage d'utiliser les réécritures d'URL pour améliorer un site. Après m'y être penché, et avoir réussi ce que je voulais, il reste un problème que l'on me demande de résoudre (et que je n'arrive pas...) :

    Je resors des données d'une base MYSQL. J'utilise donc les "id" de chaque rubrique pour afficher ce qu'il faut. L'id se retrouve donc dans la barre d'adresse de cette forme pour le moment :

    http://localhost/monsite/quoi-de-neuf.php?id=5

    La page correspond donc à la rubrique "quoi de neuf", et l'id sert à aficher les infos (la sous-rubrique) dedans, normal.

    Après avoir insérer :

    1. RewriteRule (.*)quoi-de-neuf/([0-9]+)/(.*)/images/(.*) $1images/$3 [L]
    2. RewriteRule (.*)quoi-de-neuf/([0-9]+)/(.*)/fichiers/(.*) $1fichiers/$3 [L]
    3. RewriteRule ^quoi-de-neuf/([0-9]+)/(.*)/$ quoi-de-neuf.php?id=$1 [L]

    j'ai donc mon lien qui à cette tête :
    http://localhost/monsite/quoi-de-neu...sous-rubrique/
    Tout se passe bien, la page s'affiche, cool.

    On me demande de ne pas voir le /5/ dans l'adresse (l'id de la sous-rubrique), et là je bloque donc... puisque je dois m'en servir pour ensuite appeller ma page (ligne 3)
    RewriteRule ^quoi-de-neuf/([0-9]+)/(.*)/$ quoi-de-neuf.php?id=$1 [L]

    Avez-vous une idée pour ne pas montrer l'id dans la barre d'adresse ?

    Pendant que j'y suis, second problème :
    Comme vous pouvez le voir, avant chaque réécriture d'adresse, je suis obligé aussi de changer l'adresse de 2 dossiers "images" et "fichiers" (connexion base de données, inclusions, images etc). J'ai donc 2 dossiers à la racine http://localhost/monsite/ et comme je change l'adresse de chaque page (j'ai bien une vingtaine de page php suivant toutes mes rubriques), si je ne mets pas les deux lignes (ligne 1 et 2 de mon exemple), beh il ne trouve plus les images, le CSS, etc. Avez-vous une solution pour que quelque soit le changement d'adresse pour mes différentes rubriques que je fais avec le htaccess, qu'il puisse trouver mes 2 dossiers (ça diminuerais de moitié mon htacces...). Dy style 2 RewriteRule dès le début du htaccess qui font que quelque soit l'adresse, mes liens vers ces 2 dossiers pointeront au bon endroit

    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Bonjour,

    Pour ton premier problème concernant les identifiants, ce n'est pas possible, puisque en effet tu l'utilises pour appeler ta page. Pour ne pas afficher l'identifiant (le chiffre), il suffit d'avoir dans ta base un identifiant qui ne soit pas un chiffre ! Et qui serait plutôt un nom de titre, qui doit être unique bien évidemment, ce qui n'est pas le top, mais bon...

    Par rapport à ton second problème, tu peux spécifier un répertoire de "base" pour la page en utilisant la balise du même nom (à mettre entre les balises <head>...</head> et avant l'inclusion de ta page CSS, de tes scripts, et de tes images)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <base href="http://adresse_du_site/repertoire/" />
    Ce répertoire sera alors utilisé pour tous les liens relatifs de ta page.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Merci pour le conseil !

    Je savais bien que ce n'était pas possible... Mais j'ai quand même trouvé la solution à mon problème. Dès que je fais une action dans ma zone d'aministration, je met à jour mon .htaccess (ouverture du fichier, ecriture, effacement si nécessaire, etc puis fermeture), et donc c'est à ce niveau que j'ecris le chemin sans l'id mais qui point sur l'id souhaité Exemple :
    Je fais une insertion, je récupère l'id, le nom de la rubrique et sous ribrique, puis j'ouvre mon htaccess et j'écris dedans. Ca me donne un truck du genre dans mon fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #idees-recettes/test/
    RewriteRule (.*)idees-recettes/canard-laque/images/(.*) $1images/$2 [L]
    RewriteRule (.*)idees-recettes/canard-laque/fichiers/(.*) $1fichiers/$2 [L]
    RewriteRule ^idees-recettes/canard-laque/$ idees-recettes.php?id=48 [L]

    Bref, j'ai du créé plusieurs fonctions pour gérer ce htaccess au niveau de l'admin, et tout roule impeccable !

    A+ et merci.

  4. #4
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Tu créés dynamiquement ton htaccess ?
    Mais dans ton cas, tu écris autant de lignes que d'entrées dans ta BD, ça fait un peu beaucoup...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Oui, c'est sûr !

    A chaque rubrique ajoutée, 4 lignes sont ajoutées au .htaccess (commentaires + redirection).

    C'est lourd, mais on m'a demandé de ne pas montrer l'id dans la barre d'adresse, mais de mettre le nom du produit. Comme chaque produit est désigné par son ID, j'ai dû faire comme ça.

    Si je le fesais pour moi, en quelques lignes celà aurait été plié... et l'id aurait été subtilement glissé entre des mots dans l'adresse !

    Merci quand même pour ton aide.

    Je donne mon fichier qui me sert à faire tout ça (on sait jamais, si quelqu'un rencontre le même problème...).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    <?php
    // Fonction de remplacement des caratères spéciaux
    function replace_titles($title){
    	// Caractères à prendre en compte
    	$caracteres = array("&", ",", ";", ":", "!", "€", " ", "/", "?", "^", "¨", "$", "%", "(", ")", "[", "]", "'");
    	$caracteresE = array("é", "è", "ê", "ë");
    	$caracteresA = array("â", "ä", "à");
    	$caracteresU = array("ù", "û", "ü");
    	$caracteresI = array("î", "ï");
    	$caracteresO = array("ô", "ö");
     
    	// On applique les transformations à la chaine donnée
    	$title =  str_replace($caracteres,"-",$title);
    	$title =  str_replace($caracteresE,"e",$title);
    	$title =  str_replace($caracteresA,"a",$title);
    	$title =  str_replace($caracteresU,"u",$title);
    	$title =  str_replace($caracteresI,"i",$title);
    	$title =  str_replace($caracteresO,"o",$title);
     
    	// On renvoit la chaîne transformée
    	return strtolower($title);
    }
     
    // Fonction d'écriture dans le fichier .htaccess
    // utile lors de la création d'une idée recette
    // ou à la suite de son déplacement (réécriture)
    function write_idees_recettes($url_htaccess, $rubrique, $ssrubrique, $nom_recette, $id_recette){
    	// On associe à $fichier l'URL du fichier à écrire
    	$url_fichier = $url_htaccess;
     
    	// On vérifie que le fichier existe
    	// le fichier existe
    	if(file_exists($url_fichier)){
    		// On regarde si on ajoute simplement une rubrique ou si on ajoute une recette dans une rubrique
    		if(empty($nom_recette)){
    			// On crée les 3 lignes à écrire
    			$ligne0 = '#'.replace_titles($rubrique).'/'.replace_titles($ssrubrique);
    			$ligne1 = 'RewriteRule (.*)'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/images/(.*) $1images/$2 [L]';
    			$ligne2 = 'RewriteRule (.*)'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/fichiers/(.*) $1fichiers/$2 [L]';
    			$ligne3 = 'RewriteRule ^'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/$ idees-recettes.php?id='.$id_recette.' [L]';
    			$ecriture = true;
    		}
    		else if($nom_recette != "pas de sous rubriques"){
    			$ligne0 = '#'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/'.replace_titles($nom_recette);
    			$ligne1 = 'RewriteRule (.*)'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/'.replace_titles($nom_recette).'/images/(.*) $1images/$2 [L]';
    			$ligne2 = 'RewriteRule (.*)'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/'.replace_titles($nom_recette).'/fichiers/(.*) $1fichiers/$2 [L]';
    			$ligne3 = 'RewriteRule ^'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/'.replace_titles($nom_recette).'/$ idees-recettes.php?id='.$id_recette.' [L]';
    			$ecriture = true;
    		}
    		else {
    			$ecriture = false;
    			// On écrit pas mais il n'y a pas d'erreur
    			return true;
    		}
     
    		// ouverture du fichier en écriture
    		if($ecriture == true and $fichier = fopen($url_fichier,"a")){
    			// On écrit nos 3 lignes
    			fputs($fichier, "\n\n");
    			fputs($fichier, $ligne0);
    			fputs($fichier, "\n");
    			fputs($fichier, $ligne1);
    			fputs($fichier, "\n");
    			fputs($fichier, $ligne2);
    			fputs($fichier, "\n");
    			fputs($fichier, $ligne3);
     
    			// fermeture du fichier
    			fclose($fichier);
     
    			// code ok
    			return true;
    		}
    	}
    	else {
    		// code erreur
    		return false;
    	}
     
    } 
     
     
    function write_quoi_de_neuf($url_htaccess, $rubrique, $ssrubrique, $id_quoi_de_neuf){
    	// On associe à $fichier l'URL du fichier à écrire
    	$url_fichier = $url_htaccess;
     
    	// On vérifie que le fichier existe
    	// le fichier existe
    	if(file_exists($url_fichier)){
     
    		// On crée les 3 lignes à écrire
    		$ligne0 = '#'.replace_titles($rubrique).'/'.replace_titles($ssrubrique);
    		$ligne1 = 'RewriteRule (.*)'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/images/(.*) $1images/$2 [L]';
    		$ligne2 = 'RewriteRule (.*)'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/fichiers/(.*) $1fichiers/$2 [L]';
    		$ligne3 = 'RewriteRule ^'.replace_titles($rubrique).'/'.replace_titles($ssrubrique).'/$ quoi-de-neuf.php?id='.$id_quoi_de_neuf.' [L]';
     
     
    		// ouverture du fichier en écriture
    		if($fichier = fopen($url_fichier,"a")){
    			// On écrit nos 3 lignes
    			fputs($fichier, "\n\n");
    			fputs($fichier, $ligne0);
    			fputs($fichier, "\n");
    			fputs($fichier, $ligne1);
    			fputs($fichier, "\n");
    			fputs($fichier, $ligne2);
    			fputs($fichier, "\n");
    			fputs($fichier, $ligne3);
     
    			// fermeture du fichier
    			fclose($fichier);
     
    			// code ok
    			return true;
    		}
    	}
    	else {
    		// code erreur
    		return false;
    	}
     
    } 
     
     
    // Fonction de suppression dans le fichier .htaccess
    // utile lors de déplacement ou suppression
    // remove >> catégorie + recette
    function remove_cat($url_htaccess, $cat){
    	// On associe à $fichier l'URL du fichier à écrire
    	$url_fichier = $url_htaccess;
     
    	// On vérifie que le fichier existe
    	if(file_exists($url_fichier)){
    		// ouverture du fichier en écriture
    		if($fichier = fopen($url_fichier,"r+")){
    			// On repère les lignes
    			while(!feof($fichier)){
                    $ligne[] = fgets($fichier,1000); 
                }
     
    			//placer le pointeur du fichier au début
    			rewind($fichier);
     
    			// On affiche ce qu'on a récupéré
    			$chaineATrouver = replace_titles($cat);
    			for($i=0; $i<sizeof($ligne); $i++){
    				if(ereg($chaineATrouver,$ligne[$i],$out)){ $retour_ligne_sup = true; }
    				else{$newFile .= $ligne[$i];}
    			}
     
    			// on ferme le fichier
                fclose($fichier);
     
    			// On réécrit dans le fichier
    			if($fichier = fopen($url_fichier, "w+")){
                	fputs($fichier, $newFile);
                	fclose($fichier);
     
                	// code ok
    				return 0;
    			}
    			else {
    				// code erreur
    				return true;
    			}
    		}
    		else {
    			// code erreur
    			return false;
    		}
    	}
    	else {
    		// code erreur
    		return false;
    	}
    }
     
     
    // Fonction de suppression dans le fichier .htaccess
    // utile lors de déplacement ou suppression
    // remove >> recette uniquement
    function remove_recette($url_htaccess, $nom_recette){
    	// On associe à $fichier l'URL du fichier à écrire
    	$url_fichier = $url_htaccess;
     
    	// On vérifie que le fichier existe
    	if(file_exists($url_fichier)){
    		// ouverture du fichier en écriture
    		if($fichier = fopen($url_fichier,"r+")){
    			// On repère les lignes
    			while(!feof($fichier)){
                    $ligne[] = fgets($fichier,1000); 
                }
     
    			//placer le pointeur du fichier au début
    			rewind($fichier);
     
    			// On affiche ce qu'on a récupéré
    			$chaineATrouver = replace_titles($nom_recette);
    			for($i=0; $i<sizeof($ligne); $i++){
    				if(ereg($chaineATrouver,$ligne[$i],$out)){}
    				else{$newFile .= $ligne[$i];}
    			}
     
    			// on ferme le fichier
                fclose($fichier);
     
    			// On réécrit dans le fichier
    			if($fichier = fopen($url_fichier, "w+")){
                	fputs($fichier, $newFile);
                	fclose($fichier);
     
                	// code ok
    				return 0;
    			}
    			else {
    				// code erreur
    				return true;
    			}
    		}
    		else {
    			// code erreur
    			return false;
    		}
    	}
    	else {
    		// code erreur
    		return false;
    	}
    }
     
     
    // fonction de test si la catégorie existe
    // utile lors de l'écriture d'une adresse dans htaccess
    function cat_exists($url_htaccess, $cat){
    	// On associe à $fichier l'URL du fichier à écrire
    	$url_fichier = $url_htaccess;
     
    	// On vérifie que le fichier existe
    	if(file_exists($url_fichier)){
    		// ouverture du fichier en écriture
    		if($fichier = fopen($url_fichier,"r+")){
    			// On repère les lignes
    			while(!feof($fichier)){
                    $ligne[] = fgets($fichier,1000);
                }
     
    			//placer le pointeur du fichier au début
    			rewind($fichier);
     
    			// on regarde si la catégorie existe
    			for($i=0; $i<sizeof($ligne); $i++){
    				if(ereg(replace_titles($cat),$ligne[$i],$out)){
    					// on ferme le fichier
                		fclose($fichier);
     
    					// On retourne que la catégorie existe
    					return true;
    				}
    			}
    		}
    		else {
    			// code erreur
    			return false;
    		}
    	}
    	else {
    		// code erreur
    		return false;
    	}
    }
     
     
    // fonction de test si la catégorie existe
    // utile lors de l'écriture d'une adresse dans htaccess
    function article_exists($url_htaccess, $article){
    	// On associe à $fichier l'URL du fichier à écrire
    	$url_fichier = $url_htaccess;
     
    	// On vérifie que le fichier existe
    	if(file_exists($url_fichier)){
    		// ouverture du fichier en écriture
    		if($fichier = fopen($url_fichier,"r+")){
    			// On repère les lignes
    			while(!feof($fichier)){
                    $ligne[] = fgets($fichier,1000);
                }
     
    			//placer le pointeur du fichier au début
    			rewind($fichier);
     
    			// on regarde si la catégorie existe
    			for($i=0; $i<sizeof($ligne); $i++){
    				if(ereg(replace_titles($article),$ligne[$i],$out)){
    					// on ferme le fichier
                		fclose($fichier);
     
    					// On retourne que la catégorie existe
    					return true;
    				}
    			}
    		}
    		else {
    			// code erreur
    			return false;
    		}
    	}
    	else {
    		// code erreur
    		return false;
    	}
    }
     
    ?>

Discussions similaires

  1. [URL rewriting] Supprimer le www d'une adresse
    Par aiphes dans le forum Apache
    Réponses: 3
    Dernier message: 05/07/2011, 22h21
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. [LG]supprimer un enregistrement dans un fichier
    Par Marcus2211 dans le forum Langage
    Réponses: 10
    Dernier message: 17/11/2003, 00h59
  4. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30
  5. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo