Bonsoir amis codeurs,
J'ai récemment entrepris la décision d'avoir de belles URL, et un petit problème s'est glisser.. En fait, c'est simple. Actuellement mes URLs sont redirigés comme ceci :
http://monsite.fr/index.php => http://monsite.fr/home
http://monsite.fr/contact.php => http://monsite.fr/contact
Options +FollowSymLinksaroundRewriteEngine OnaroundRewriteBase /aroundaroundRewriteCond %{REQUEST_FILENAME} !-faroundRewriteCond %{REQUEST_FILENAME} !-daroundaroundRewriteRule ^home$ index.php [L]aroundRewriteRule ^contact$ contact.php [L]
Avant tout chose, je tiens à préciser que dans tous mes fichiers les liens ont bien été modifier vers les nouvelles URLs.
Le problème rencontré est le fait que, si je dans ma barre d'adresse je tape http://monsite.fr/index.php, eh bien l'URL n'est pas automatiquement rediriger vers ../home. Du coup, c'est un peu embêtant !
J'ai Google-isé mon problème, et suit tombé sur la possibilité d'utiliser un flag R=301, simulant une redirection 301. Cependant, cela m'injecte une erreur 500 et rien ne fonctionne.
J'ai besoin de lumière, car aucune solution, je vois.
Si vous pourriez m'éclairer, ce serait top :ange:
Merci par avance aux personnes qui me porteront de l'aide !
Legendary
Salut,
je me permet de re-présenter ton code convenablement :
RewriteEngine On
Options +FollowSymLinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^home$ index.php [L]
RewriteRule ^contact$ contact.php [L]
[EDIT]
j'avais écris un truc mais j'avais très mal compris ton problème.
Je crois que j'ai mieux compris maintenant.
En fait avec la réécriture d'URL, la "redirection" ne se fait PAS dans ce sens
http://monsite.fr/index.php => http://monsite.fr/home
mais dans l'autre
http://monsite.fr/home => http://monsite.fr/index.php
Toi sur ton site tu défini une constante BASE_URL quelque part (disons dans le index.php):
// index.php
define('BASE_URL', __DIR__ . '/'); // adapte bien selon ton cas, si besoin, hein !
ensuite tu utilises des liens de cette façon :
<a href="<?= BASE_URL ?>Home">Accueil</a>
et le htaccess de cette façon :
RewriteEngine On
Options +FollowSymLinks
RewriteBase /
RewriteRule ^Home$ index.php [L]
RewriteRule ^Contact$ contact.php [L]
// si le fichier demandé n existe PAS, on redirige vers l index... (ou page introuvable ou n importe)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L]
Voilà, ton lien qui sera :
mon_dossier_root/Home
s'affichera dans la barre d'adresse (c'est mieux pour l'utilisateur, et pour les robots des moteurs de recherche)
PAR CONTRE, le serveur WEB lui ne prendra pas en compte :
mon_dossier_root/Home (même si c'est ce qui sera affiché dans la barre d'adresse)
il prendra en compte l'url modifé par le htaccess :
mon_dossier_root/index.php (parfait)
Salut @SLK, et merci pour ta réponse vraiment bien structurée et pertinente.
Cependant, je pense que tu as mal cerné le problème :)
En fait, mon problème est que www.mon-site.fr/home redirige bien, et de même pour www.mon-site.fr/index.php
Cependant, j'aimerais que, au cas où l'utilisateur tape www.mon-site.fr/index.php (ou tout autre page d'ailleurs), que ça ne redirige uniquement vers /home et que sur index.php, cela redirige vers une 404.
Tchao.
Ah ben zut alors. ^^
Par contre, je ne comprends toujours pas très bien :
www.mon-site.fr/home => (redirige vers quoi ?)
www.mon-site.fr/index.php => (redirige vers quoi ?)
Est-ce que tu peux reformuler la dernière phrase ? Je n'arrive pas à la comprendre :
Cependant, j'aimerais que, au cas où l'utilisateur tape www.mon-site.fr/index.php (ou tout autre page d'ailleurs), que ça ne redirige uniquement vers /home et que sur index.php, cela redirige vers une 404.
j'ai cru comprendre :
index et autres => vers home
index => vers 404
Mais ça n'a pas de sens.
Salut,
Alors oui, c'était peut-être pas très clair en effet. Je vais essayer de reformuler.
Voici ma situation actuelle (du point de vue du htaccess) :
http://mon-site.fr/index.php => http://mon-site.fr/home
http://mon-site.fr/contact.php => http://mon-site.fr/contact
(et ainsi de suite)
Maintenant, prenons le cas où un utilisateur, pour x raison, tape http://mon-site.fr/contact.php (qui est en réalité la vrai page).
Cela va le rediriger normalement vers la page.
Mais pour une raison de sécurité (par rapport aux autres pages où des paramètres sont envoyer par l'URL) et de beauté j'aimerais que qoiqu'il arrive, l'utilisateur doit obligatoirement se rendre sur http://mon-site.fr/accueil (ou équivalent).
Et si le cas où l'utilisateur tape http://mon-site.fr/index.php, cela doit lui afficher une erreur 404 (car par logique, normalement http://mon-site.fr/index.php est redirigé vers http://mon-site.fr/home).
J'espère avoir été assez clair, et espère que tu réussiras à mieux cerner le problème.
Merci à toi pour ton temps :)
Legendary
Je pense avoir compris 2 choses :
1)
Même si, en tappant "index.php", on est redirigé vers "home" (ce qui semble être un comportement acceptable),
c'est quelque chose que tu ne veux PAS, parce-que :
ça va laisser "index.php" d'affiché dans la barre d'adresse, et ça fait "laid".
2)
Tu ne veux PAS qu'on puisse accéder au site, SANS être passé par "home" (l'accueil), parce-que :
certaines pages ont BESOIN qu'on leur transmettent des variables pour fonctionner,
alors si on va directement sur une de ces pages, en tappant son adresse directement dans la barre d'adresse, on ne lui a pas transmis ces variables dont elle a besoin (et ça craint).
Pour répondre à 1) :
Il me semble que ce qui te conviendrait est un système de "router".
Est-ce que tu utilises le pattern MVC et le PHP Objet ?
Pour répondre à 2)
J'ai l'impression qu'on fait fausse route ici, ce n'est pas la démarche à suivre.
Laisse les utilisateurs aller directement où ils veulent s'ils en ont envie, par contre :
vérifies bien à CHAQUE page qui a besoin de variables pour fonctionner, qu'elle a bien reçu ces variables, et sinon tu rediriges, soit vers l'accueil, soit vers la page précédente (mais tu dois alors avoir un système qui enregistre la page courante, et la page précédente à chaque navigation).
C'est plutôt comme ça qu'il faut voir les choses (je pense).
Est-ce que je peux voir ton .htaccess ?
Salut,
Je n'utilise pas encore le pattern MVC malheuresement.
Concrètement, j'aimerais qu'il n'y ait plus aucun accès vers les pages en .php :)
Mon htaccess :
RewriteEngine On
RewriteBase /
Options +FollowSymlinks
# GLOBAL #
RewriteRule ^home$ index.php [L]
RewriteRule ^contact$ contact.php [L]
# USER #
RewriteRule ^connexion$ login.php [L]
RewriteRule ^profil$ account.php [L]
RewriteRule ^profil/apercu/([a-z]+)-([a-z]+)$ account.php?view&firstname=$1&lastname=$2 [L]
# MODULES #
RewriteRule ^modules/messagerie$ /modules/mod_msg.php [L]
RewriteRule ^modules/messagerie/write$ /modules/mod_msg_write.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L]
ErrorDocument 400 /errors.php?errors=400
ErrorDocument 401 /errors.php?errors=401
ErrorDocument 402 /errors.php?errors=402
ErrorDocument 403 /errors.php?errors=403
ErrorDocument 404 /errors.php?errors=404
ErrorDocument 405 /errors.php?errors=405
ErrorDocument 500 /errors.php?errors=500
ErrorDocument 501 /errors.php?errors=501
ErrorDocument 502 /errors.php?errors=502
ErrorDocument 503 /errors.php?errors=503
ErrorDocument 504 /errors.php?errors=504
ErrorDocument 505 /errors.php?errors=505
Je ne suis pas un pro du htaccess, donc j'apprends d'avantage en posant des questions :)
Ah d'accord,
Est-ce qu'en rajoutant un RewriteRule (après #modules) ça résoud le problème ?
N'importe quoi qui finir par ".php", on le redirige vers "page introuvable".
...
# MODULES #
RewriteRule ^modules/messagerie$ /modules/mod_msg.php [L]
RewriteRule ^modules/messagerie/write$ /modules/mod_msg_write.php [L]
RewriteRule ^(.*)\.php$ page_not_found.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L]
...
Salut,
Mhh, nop cela ne fonctionne. Et avec la règle que tu m'as donné, plus aucune page n'est accessible :)
Ah oui.... Effectivement, maintenant que tu me le dis je me rends compte que c'était bête...
Mince, je ne vois pas comment faire ça.
Désolé, je bloque moi aussi.
D'accord SLK, tant pis, merci pour ton temps et tes réponses, elles m'ont quand même appris des choses, et c'est important :)
Je vais continuer mes recherches, mais si une âme charitable passe sur ce topic et qu'ils souhaitent nous aider à trouver une solution à cela, qu'ils se manifeste ou se taise à jamais :)
Merci encore SLK :)