[RESOLU] url rewriting et include capricieux

astanos

Nouveau WRInaute
Bonjour,
J'ai un soucis lorsque je veux implémenter de l'url rewriting sur un domaine (chez infomaniak, php5).
Les pages sont gérées en tant que pseudo-frames avec un include, ce qui donne une URL du type www.site.com/?page=toto
L'index va chercher la page toto.php et l'inclue dans le corps de la page.
Au début de mon index, j'utilise la fonction define(...) et j'inclue mes fichiers conf. Je rappelle ensuite if(!defined(...)) {die('accès interdit')} sur toutes les autres pages du site, afin d'en empêcher l'accès direct.

J'aimerais donc obtenir www.site.com/toto/

Le mod_rewrite est bien activé (testé avec RewriteRule ^test.html$ /test.php [L], ça marche nickel)

J'ai saisi ceci dans mon .htaccess:

Code:
Options +FollowSymlinks
RewriteEngine on

RewriteRule ^([a-z]+)/$ /index.php?page=$1 [L]
ou
Code:
RewriteRule ^([a-z]+)/$ /?page=$1 [L]
(normalement les deux marchent)
et même
Code:
RewriteRule ^toto/$ /index.php?page=toto [L]

En utilisant l'url www.site.com/?page=toto, la page s'affiche. Par contre, en utilisant www.site.com/toto/ c'est comme s'il allait chercher www.site.com/toto.php et non www.site.com/?page=toto. Conclusion: j'ai un magnifique 'accès interdit'...
J'ai tenté d'enlever le define() pour voir comment le tout réagi, mais cette fois c'est mes fichiers conf qui ne sont pas inclus. On dirait qu'il 'zappe' la page index.php et l'include et va directement chercher la page inclue...
Par contre ca marche à la perfection en local (Win, easyPHP 2.0b1)

Auriez-vous une idée?

Merci d'avance =)
 

webmasterlamogere

WRInaute passionné
Il n'y a pas de problème dans la règle citée mais tu peux ajouter un test devant pour éviter de réécrire pour un répertoire ou un fichier existant :
Code:
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-z]+)/$ /index.php?page=$1 [L]

tu utilises bien la variable $_GET['page'] dans index.php pour récupérer la page?
 

astanos

Nouveau WRInaute
Toujours la même chose malgré le test que tu m'as proposé :/

Sinon les pages sont bien récupérées avec un $_GET['page']. Par contre pas directement dans l'index, mais dans un fichier menu.php où je compare le $_GET reçu avec un switch et des noms de pages prédéfinis. (fichier menu.php en require en haut de mon index)

Ce que je ne comprends pas c'est que ça marche en local mais pas en prod sur un serveur.
 

webmasterlamogere

WRInaute passionné
c'est peut être un problème de chemin d'accès "relatif" car avec ta réécriture, les fichiers sont relatif au répertoire virtuel /toto/ et plus la racine.
 

astanos

Nouveau WRInaute
Possible que se soit un problème de chemin relatif, mais alors pourquoi ma redirection pointe vers www.site.com/toto.php?
Cette page n'est jamais accédée directement, elle est inclue dans index.php :/
D'ailleurs si j'insère un echo 'page: '.$_GET['page']; au début de toto.php, que je vais à www.site.com/toto/ il ne me retourne que 'page: ' et rien d'autre. Pas de valeur dans le get, aucune page inclue, rien. Il me fait donc bien pointer www.site.com/toto/ sur www.site.com/toto.php
 

webmasterlamogere

WRInaute passionné
le problème de lien relatif est uniquement en html (pour les liens et les images de la page) pas au niveau php ou htaccess.

pour voir d'ou vient le problème je remplacerais index.php dans le .htaccess par test.php avec uniquement un echo $_GET['page'] dedans.
 

astanos

Nouveau WRInaute
Rien à faire...
Avec une page de test toute simple et un echo $_GET['page'] ça marche. Que se soit le rewriting et l'echo du $_GET

Avec une page de ce style:

Code:
echo 'bibi';

include($_GET['page'].'.php');

il m'affiche la page inclue mais pas de 'bibi' sur la page... donc en gros il me retourne la page inclue et c'est tout. Rien de ce qui est sur la page principale comprenant l'include :/
 

astanos

Nouveau WRInaute
Bah voici mes 2 pages de test:

test.php
Code:
<?php
echo 'bibi';

include($_GET['page'].'.php');
?>

et phpinfo.php
Code:
<?php

phpinfo();

?>

Pas de headers défini. Et malgré ça, www.site.com/phpinfo/ n'affiche pas 'bibi' en début de page, alors qu'il devrait.
 

astanos

Nouveau WRInaute
Bonjour tout le monde,

Pour info, problème résolu il y a quelques jours grace au staff d'infomaniak.
L'astuce: ajouter ceci dans le .htaccess:

Code:
Options -MultiViews

Le MultiViews permet la substitution d'extensions qui sert entre autre à pouvoir appeler la page www.site.com/toto.php par www.site.com/toto ou même www.site.com/toto/ <- le problème était donc là!
Donc si quelqu'un d'autre à ce genre de soucis chez infomaniak... il saura quoi faire :)
 

ova

Nouveau WRInaute
Merci !

Je viens effectivement d'avoir ce pb sur un serveur infomaniak ! Et grâce à toi, c'est résolu !

Merci d'avoir pour l'info !

:: Ova ::
 

benoith

Nouveau WRInaute
Ce problème est toujours d'actualité!
J'ai perdu une demi-journée dessus, et Infomaniak n'a pas su trouver la solution!!!

Bref, merci BEAUCOUP!
 

Discussions similaires

Haut