problèmes d'URL rewriting combiné avec PHP + erreurs apache
4 messages • Page 1 sur 1
Consultez la formation URL Rewriting et sites dynamiques de WebRankInfo / Ranking Metrics
problèmes d'URL rewriting combiné avec PHP + erreurs apache
Depuis ce matin, je tente de faire quelque chose avec l'URL rewriting : je voudrais rediriger toutes les requêtes vers des fichiers non PHP vers le fichier afficher.php. J'ai donc modifié mon fichier .htaccess en ajoutant la ligne suivante :
J'ai fait des essais, et ça marche un peu. Mais ça cause aussi beaucoup de problèmes.
Dans le fichier afficher.php, je récupère en paramètre le nom du fichier d'origine, je fais un traitement basé là-dessus, puis je renvoie le contenu au visiteur (oui tout de même c'est mieux
).
Mais avec ce système, ma gestion des erreurs 404 et autres ne fonctionne plus, et lorsque le visiteur accède à une adresse du genre : http://www.example.com/dossier ça crée des problèmes pour récupérer en PHP le nom réel du fichier qui aurait dû être servi par Apache. Alors je teste si c'est un dossier, je rajoute un /, puis je teste l'existence d'un fichier : index.html, index.htm puis index.php
Si aucun des trois précédents n'existe, je renvoie une erreur 404, mais pas ma page d'erreur personnalisée :
Je n'ai pas compris comment je pouvais faire mieux.
Conclusion, c'est un peu le bazar cette première tentative.
Si vous avez une suggestion pour améliorer tout ça, n'hésitez pas.
Merci.
Jocelyn
- Code: Tout sélectionner
RewriteRule !(^.*\.php) afficher.php?fichier=%{REQUEST_FILENAME} [L]
J'ai fait des essais, et ça marche un peu. Mais ça cause aussi beaucoup de problèmes.
Dans le fichier afficher.php, je récupère en paramètre le nom du fichier d'origine, je fais un traitement basé là-dessus, puis je renvoie le contenu au visiteur (oui tout de même c'est mieux
Mais avec ce système, ma gestion des erreurs 404 et autres ne fonctionne plus, et lorsque le visiteur accède à une adresse du genre : http://www.example.com/dossier ça crée des problèmes pour récupérer en PHP le nom réel du fichier qui aurait dû être servi par Apache. Alors je teste si c'est un dossier, je rajoute un /, puis je teste l'existence d'un fichier : index.html, index.htm puis index.php
Si aucun des trois précédents n'existe, je renvoie une erreur 404, mais pas ma page d'erreur personnalisée :
- Code: Tout sélectionner
header('HTTP/1.0 404 Not Found');
Je n'ai pas compris comment je pouvais faire mieux.
Conclusion, c'est un peu le bazar cette première tentative.
Si vous avez une suggestion pour améliorer tout ça, n'hésitez pas.
Merci.
Jocelyn
Bon, personne n'a répondu à mon message.
Tout le monde est certainement trop absorber à observer la mise à jour de Google.
J'ai amélioré un peu mon code dans le .htaccess :
La ligne RewriteCond indique que l'URL ne doit être réécrite que si le fichier est un fichier existant, y compris par une règle d'URL rewriting.
J'ai fait quelques tests, ça semble fonctionner, j'ai "retrouvé" mes pages d'erreurs personnalisées maintenant (erreur 404, 401 notamment). Je vais continuer à tester, et vérifier qu'il n'y a pas de faille de sécurité, puis je mettrai en oeuvre sur tout le site si tout va bien.
----
Je viens de corriger une erreur dans le code pour RewriteCond : l'option -F ne doit pas être entre crochets, d'après la doc. J'ai confondu avec les flags pour RewriteRule qui eux sont entre crochets.
J'ai également tenté le code suivant :
Mais ça ne fonctionne pas mieux. Je n'ai pas l'impression que ça m'est utile dans mon cas.
Mon problème est le suivant : si on accède à http://example.com/dossier/, en temps normal Apache va lire la directive DirectoryIndex pour déterminer quel est le fichier par défaut à afficher (le premier trouvé sera celui qui sera affiché. Sinon, soit un listing de répertoire soit une erreur "accès refusé" seront renvoyés)
Dans mon cas, une requête pour http://example.com/dossier/ va être réécrite en http://example.com/afficher.php?fichier=c:\web\dossier\
Après, je voudrais :
- soit que Apache (par l'intermédiaire de la réécriture dans le fichier .htaccess) indique automatiquement le fichier par défaut à utiliser
- soit que mon script PHP détermine automatiquement quel est le fichier par défaut à utiliser
Dans les 2 cas, je suis coincé...
http://httpd.apache.org/docs/mod/mod_rewrite.html
http://httpd.apache.org/docs/misc/rewriteguide.html
http://httpd.apache.org/docs/mod/mod_di ... ctoryindex
Tout le monde est certainement trop absorber à observer la mise à jour de Google.
J'ai amélioré un peu mon code dans le .htaccess :
- Code: Tout sélectionner
RewriteCond %{REQUEST_FILENAME} -F
RewriteRule !(^.*\.php) afficher.php?fichier=%{REQUEST_FILENAME} [L]
La ligne RewriteCond indique que l'URL ne doit être réécrite que si le fichier est un fichier existant, y compris par une règle d'URL rewriting.
J'ai fait quelques tests, ça semble fonctionner, j'ai "retrouvé" mes pages d'erreurs personnalisées maintenant (erreur 404, 401 notamment). Je vais continuer à tester, et vérifier qu'il n'y a pas de faille de sécurité, puis je mettrai en oeuvre sur tout le site si tout va bien.
----
Je viens de corriger une erreur dans le code pour RewriteCond : l'option -F ne doit pas être entre crochets, d'après la doc. J'ai confondu avec les flags pour RewriteRule qui eux sont entre crochets.
J'ai également tenté le code suivant :
- Code: Tout sélectionner
RewriteCond %{REQUEST_FILENAME} -F
RewriteRule !(^.*\.php) afficher.php?fichier=%{LA-U:REQUEST_URI} [L]
Mais ça ne fonctionne pas mieux. Je n'ai pas l'impression que ça m'est utile dans mon cas.
Mon problème est le suivant : si on accède à http://example.com/dossier/, en temps normal Apache va lire la directive DirectoryIndex pour déterminer quel est le fichier par défaut à afficher (le premier trouvé sera celui qui sera affiché. Sinon, soit un listing de répertoire soit une erreur "accès refusé" seront renvoyés)
Dans mon cas, une requête pour http://example.com/dossier/ va être réécrite en http://example.com/afficher.php?fichier=c:\web\dossier\
Après, je voudrais :
- soit que Apache (par l'intermédiaire de la réécriture dans le fichier .htaccess) indique automatiquement le fichier par défaut à utiliser
- soit que mon script PHP détermine automatiquement quel est le fichier par défaut à utiliser
Dans les 2 cas, je suis coincé...
http://httpd.apache.org/docs/mod/mod_rewrite.html
http://httpd.apache.org/docs/misc/rewriteguide.html
http://httpd.apache.org/docs/mod/mod_di ... ctoryindex
Jocelyn,
éviterait ta réécriture dans le cas d'un répertoire, non ?
Dans ce cas tu aurais le traitement par défaut d'Apache.
Dan
- Code: Tout sélectionner
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -F
RewriteRule !(^.*\.php) afficher.php?fichier=%{REQUEST_FILENAME} [L]
éviterait ta réécriture dans le cas d'un répertoire, non ?
Dans ce cas tu aurais le traitement par défaut d'Apache.
Dan
Ca y est, je me suis replongé dans la doc.
En effet, la première ligne que tu proposes de rajouter évite le traitement des répertoires. Hors ce n'est pas ce que je voulais, moi je voulais aussi traiter les répertoires.
Mais bon, une unique ligne de code à ajouter, autant essayer.
Et maintenant, je suis perplexe
Contre toute attente, ce code fonctionne ET fait ce que je désirais au début.
Avec mon code :
Voici ce que j'obtenais dans le fichier afficher.php :
Maintenant, avec ton code, Dan :
D'une manière que je ne comprends pas encore, les requêtes fonctionnent :
une requête pour :
fonctionne dans tous les cas, et la variable $fichier (dans afficher.php) et correctement renseignée :
http://www.example.com/dossier et http://www.example.com/dossier/
$fichier = d:/web/dossier/index.html
Dans le cas d'une requête pour http://www.example.com/dossier, d'après ce que j'ai compris de la documentation, il semblerait que Apache fasse une réécriture (ou plusieurs ?) en interne, et au final il tombe sur une URL de fichier et à ce moment seulement la ligne RewriteRule du fichier .htaccess peut entrer en action.
Un grand merci à toi Dan
Les voies du mod_rewrite sont parfois impénétrables...
Jocelyn
En effet, la première ligne que tu proposes de rajouter évite le traitement des répertoires. Hors ce n'est pas ce que je voulais, moi je voulais aussi traiter les répertoires.
Mais bon, une unique ligne de code à ajouter, autant essayer.
Et maintenant, je suis perplexe
Avec mon code :
- Code: Tout sélectionner
RewriteCond %{REQUEST_FILENAME} -F
RewriteRule !(^.*\.php) afficher.php?fichier=%{REQUEST_FILENAME}
Voici ce que j'obtenais dans le fichier afficher.php :
- http://www.example.com/dossier/fichier
http://www.example.com/dossier
http://www.example.com/dossier/
Maintenant, avec ton code, Dan :
- Code: Tout sélectionner
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -F
RewriteRule !(^.*\.php) afficher.php?fichier=%{REQUEST_FILENAME} [L]
D'une manière que je ne comprends pas encore, les requêtes fonctionnent :
une requête pour :
- http://www.example.com/dossier/fichier
http://www.example.com/dossier
http://www.example.com/dossier/
fonctionne dans tous les cas, et la variable $fichier (dans afficher.php) et correctement renseignée :
http://www.example.com/dossier et http://www.example.com/dossier/
Dans le cas d'une requête pour http://www.example.com/dossier, d'après ce que j'ai compris de la documentation, il semblerait que Apache fasse une réécriture (ou plusieurs ?) en interne, et au final il tombe sur une URL de fichier et à ce moment seulement la ligne RewriteRule du fichier .htaccess peut entrer en action.
Un grand merci à toi Dan
Les voies du mod_rewrite sont parfois impénétrables...
Jocelyn
4 messages • Page 1 sur 1
Formation recommandée sur ce thème :
Formation URL Rewriting et sites dynamiques : apprenez comment mettre en place la réécriture d'URL, comment optimiser vos URL et profiter de vos pages dynamiques pour booster votre référencement. Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.
Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.
Lectures recommandées sur ce thème :
- Suite de l'article sur le fichier .htaccess : l'URL rewriting
- Tutoriel URL Rewriting
- l'URL Rewriting expliqué aux débutants
- Comment éviter les contenus dupliqués (avec/sans le www)
- Optimiser le référencement d'un forum phpBB : réécriture d'URL
- Séminaire URL Rewriting et sites dynamiques
- Référencement d'un forum phpBB
- 3ème partie de l'article .htaccess : les réécritures conditionnelles
- Nouvelles fonctionnalités à l'essai pour la Google Toolbar
- Aperçu des différents types de redirection
- Apache PHP et phpBB url rewriting sous XP
- PHP, CSS... Ou sont mes erreurs ?
- TRES URGENT: erreurs 503 et url rewriting
- Url Rewriting et Apache version 2
- url-rewriting et alias apache
- Apache ASP et URL rewriting
- URL Rewriting, Apache et Windows
- [RESOLU] Apache easyphp 1.6 URL rewriting
- Activer URL rewriting sous Apache
- Configuration apache pour url rewriting
- URL Rewriting pour server heberger not apache
- URL REWRITING avec APACHE 2, quels changements
- Mise en place URL Rewriting avec Apache 2
- Des erreurs 404 cachées dans mon URL Rewriting
- [réglé] url rewriting et apache 2 sur phpmy annu
Consultez la description détaillée des produits ou services de Google suivants : Google Web Toolkit
- Détection de pages similaires
Cet outil vous permet de calculer la similarité entre 2 pages web. L'algorithme utilisé repose sur l'analyse des occurrences des mots (mais pas sur leur positionnement dans les pages). Google utilise cette notion à certains endroits dans son algorithme, mais de façon bien plus évoluée que ce petit outil... Avoir des pages trop similaires peut entraîner des problèmes d'indexation... Cet outil vous permettra peut-être de résoudre certains problèmes de contenus dupliqués. - Analyse des backlinks
Cet outil vous permet d'analyser en détails la "popularité" de votre site sur Google. En plus du nombre de liens pris en compte par Google, il calcule le pourcentage de liens internes parmi tous les liens, et il affiche les premières URL trouvées. - Recherche de citations d'un site en texte brut
Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités




le forum