1152 sujets

Accessibilité du Web

Pages :
Bonsoir,
Je suis actuellement dans la phase de déploiement d'un petit site perso (noob).
J'aimerai rendre les adresses urls plus propres ainsi que rediriger quelques pages. Je m'explique:
Voici mon arborescence:
/root
    index.php
    .htaccess
    /pages
        home.phtml
        about.phtml
        contact.phtml
        ...

Au sein de mon index.php, on trouve la commande php d'appel des pages au sein de mon template:
if (isset($_GET['page'])){
    $page = $_GET['page'];
    $template = 'pages/'.$page.'.phtml';
    if (file_exists($template)){
        include $template;
    }else{
        include 'pages/home.phtml';
    }
}

j'ai donc des urls ressemblant à:
www.monsite.com/index.php?page=home

J'aimerai dans un premier temps que les utilisateurs arrivant sur www.monsite.com soient redirigés vers www.monsite.com/index.php?page=home et non sur mon index.php vide.
J'ai donc écrit la ligne suivante dans mon .htaccess mais sans succès:
Options +FollowSymlinks
RewriteEngine on
RedirectMatch permanent /index.php(.*)  http://www.monsite.com/index.php?page=home  [L]

J'ai également voulu changer l'affichage de mes urls en quelque chose de plus propre type www.monsite.com/home.
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^index.php?page=home.phtml$ /home [L]

Et bien pareil, ÉCHEC!
J'ai testé avec plusieurs orthographe comme par exemple:
- RewriteRule ^index.php?page=home$ /home [L]
- RewriteRule ^index.php/pages/home.phtml$ /home.html [L]
- RewriteRule ^www.monsite.com/index.php?page=home$ www.monsite.com/home.html [L]
sans aucun succès.

J'en viens a penser que mon problème vient de la façon dont sont mentionnés mes pages avec mon MVC (monsite.com/index.php?page=home). Mais n'étant pas codeur, j'ai repris ce code tel quel sur un tuto abordant ce concept. Donc, si le problème vient du php de mon index.php, je ne sais pas comment je peut résoudre ça.

(oui, mon hébergeur prend bien en charge le .htaccess, j'ai effectué un test avec un simple fichier test.html ou je pointé dans la barre d'url vers random.html et l’hébergeur me redirigeait bien vers test.html).

Merci par avance. La bise.
Modifié par westman (30 Jan 2022 - 03:03)
Modérateur
Bonjour,

1) Je modifierais légèrement ton index.php en y rajoutant tout à la fin l'inclusion de la page d'accueil quand "page" n'est pas spécifiée dans l'url :
if (isset($_GET['page'])){
    $page = $_GET['page'];
    $template = 'pages/'.$page.'.phtml';
    if (file_exists($template)){
        include $template;
    }else{
        include 'pages/home.phtml';
    }
}
else include 'pages/home.phtml';


2)Je ne mettrais dans le .htaccess que la Rewrite rule suivante dans un premier temps (pas de RedirectMatch permanent donc, et pas de RewriteRule complexe) :
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^([A-Za-z0-9_-]*)$ index.php?page=$1 [L]


Une fois que ça fonctionnera, tu pourras avancer.

EDIT: j'ai oublié de préciser qu'avec la règle de ré-écriture ci-dessus, l'internaute devra entrer les url suivante pour visiter les pages :
http://www.monsite.com/
http://www.monsite.com/home
http://www.monsite.com/about
http://www.monsite.com/contact
...

Dans le mot qui suit le /, on a avec la règle d'écriture ci-dessus le droit aux caractères alphanumériques, les tirets et les soulignés. On peut ajouter d'autres caractères si on veut dans la règle de ré-écriture. Le tiret ("-") doit cependant toujours être le dernier spécifié dans la règle de ré-écriture.

Et de même dans les liens de navigation dans ton site, tu pourras utiliser ces url là (pas besoin de mettre http://www.monsite.com/ pour les url spécifiées comme valeur de l'attribut href des liens, il suffira de mettre href="home", href="about", href="contact", etc.)

Amicalement,
Modifié par parsimonhi (30 Jan 2022 - 11:39)
Meilleure solution
Par contre ma jolie page page-not-found.phtml ne sert donc plus a rien avec cette règle Smiley lol .
Et du coup j'ai ressayé diverses manips partant de là et je n'arrive toujours pas à afficher dans la barre d'url un www.monsite.com/home plutôt que www.monsite.com/index.php?page=home. Bien que cette notation fonctionne lorsque je l'inscris, comme vous me l'avez indiqué.
On est bien d'accord que le [L] doit uniquement être sur la dernière ligne de règle (même si j'ai essayé à chaque fin de ligne ou uniquement en fin de page)?
Modérateur
Bonjour,

1) C'est à mon avis une très mauvaise idée de chercher à rediriger/ré-écrire ou n'importe quoi d'autre l'adresse www.monsite.com vers www.monsite.com/home ne serait-ce que pour le référencement qui selon moi ne peut qu'être impacté négativement avec ce genre de combine. Donc, déjà, si tu as rajouté des choses en ce sens, mon conseil : retire-les ! Pour la suite, je vais supposer que tu es revenu au code que j'ai indiqué.

2) La "page not found" peut apparaitre si on met dans la barre d'adresse une adresse contenant des caractères qui ne sont pas "capturés" par la règle de ré-écriture. Par exemple, le "." n'est pas "capturé" par la règle de ré-écriture. Si tu mets dans la barre d'adresse www.monsite.com/home.xyz, tu vas voir apparaitre ta "page not found". Si tu met www.monsite.com/home/xyz, ce sera pareil, car "/" n'est pas dans la liste des caractères à capturer dans la règle de ré-écriture.

3) Je ne comprends pas bien ce que tu entends par "je n'arrive toujours pas à afficher dans la barre d'url un www.monsite.com/home par www.monsite.com/index.php?page=home". Tu veux mettre quoi dans l'url pour afficher quoi ?

4) À propos du "[L]", tu as quoi comme autres règles ? Tu me fais peur, là ! Smiley cligne

[L] n'est pas forcément en dernière ligne. Et un humain normal ne peut pas comprendre le fonctionnement de [L] (note : je fais partie des humains normaux, donc j'ai beaucoup de mal avec [L]).

Amicalement,
2) si le caractère n'est pas prit en compte, c'est une erreur 404 et non une page non existante, et pour cela, j'ai aussi ma page 404 qui fonctionne bien Smiley smile .

3) En fait, au même titre que le fichier .htaccess est utilisé afin de rendre les url plus compréhensible (ex:
https://www.monsite.com/articles/article.php?id=12&page=2&rubrique=5
devient:
https://www.monsite.com/articles/article-12-2-5.html
grâce à:
# Article avec numéro de page :
RewriteRule ^article-([0-9]+)-([0-9]+)-([0-9]+).html   /articles/article.php?id=$1&page=$2&rubrique=$3 [L]

), je me suis dis que j'aurai pu renommer également mes pages pour des raisons esthétique tel que mentionné plus haut. et donc l'url inscrite dans la barre du navigateur:
www.monsite.com/index.php?page=home

serai transformer en cette url affichée dans la barre du navigateur:
www.monsite.com/home

ou tout du moins
www.monsite.com/home.html

J'en ai déduis que c'était faisable mais j'me trompe peut être.

4) [L]: Drapeau (option) signifiant «Last», indiquant au module de réécriture qu’il doit s’arrêter. Plus précisément, si l’URL de la page demandée par le visiteur correspond au schéma défini par cette règle, alors le module de réécriture d’URL ne doit pas examiner les autres règles situées dans le reste du fichier .htaccess. Il n’est pas toujours obligatoire mais il ne fera pas de mal !
donc dans mon fichier .htaccess, lorsque je réécris mes urls, je dois mettre
regle1 [L]
regle2 [L]
regle3 [L]

ou bien
regle1
regle2
regle3 [L]

C'est une question de formalisme. Je suis pas sur de comprendre la balise (j'ai testé les 2).
Modérateur
Bonjour,

westman a écrit :
2) si le caractère n'est pas prit en compte, c'est une erreur 404 et non une page non existante, et pour cela, j'ai aussi ma page 404 qui fonctionne bien Smiley smile .
Là, il va falloir que tu m'expliques la différence selon toi entre une url qui génère une erreur 404 et une url qui correspond à une page non existante.

westman a écrit :
3) En fait, au même titre que le fichier .htaccess est utilisé afin de rendre les url plus compréhensible (ex:
https://www.monsite.com/articles/article.php?id=12&page=2&rubrique=5
devient:
https://www.monsite.com/articles/article-12-2-5.html
grâce à:
# Article avec numéro de page :
RewriteRule ^article-([0-9]+)-([0-9]+)-([0-9]+).html   /articles/article.php?id=$1&page=$2&rubrique=$3 [L]

), je me suis dis que j'aurai pu renommer également mes pages pour des raisons esthétique tel que mentionné plus haut. et donc l'url inscrite dans la barre du navigateur:
www.monsite.com/index.php?page=home

serai transformer en cette url affichée dans la barre du navigateur:
www.monsite.com/home

ou tout du moins
www.monsite.com/home.html

J'en ai déduis que c'était faisable mais j'me trompe peut être.
Il me semble que personne ne devrait être amené à utiliser www.monsite.com/index.php?page=home, puisque normalement, ce qui sera "vu" et "manipulé" par les internautes, ce sera uniquement des url ne contenant pas index.php (et plus généralement ne contenant pas le nom d'un script php). Et par ailleurs, ça peut être un peu délicat pour éviter les boucles, car on va transformer index.php?page=xxx en xxx puis en index.php?page=xxx (voir ci-dessous le commentaire sur le drapeau "L"). À noter que ré-écrire des url contenant des ?, ça nécessite du code supplémentaire. À noter que si tu veux que l'url soit remplacée dans la barre d'adresse, il faut faire en plus (et dans ton cas "avant") une redirection (un RewriteRule avec le drapeau [R]). Bref, ça finit par faire beaucoup de complications pour quelque chose qui ne devrait pas servir en théorie. À moins que tu aies des cas particuliers (qui ne seraient pas quelque chose qu'on verrait genre une fois par an) où ça pourrait servir.

westman a écrit :
4) [L]: Drapeau (option) signifiant «Last», indiquant au module de réécriture qu’il doit s’arrêter. Plus précisément, si l’URL de la page demandée par le visiteur correspond au schéma défini par cette règle, alors le module de réécriture d’URL ne doit pas examiner les autres règles situées dans le reste du fichier .htaccess. Il n’est pas toujours obligatoire mais il ne fera pas de mal !...
Certes, le module va s'arrêter ... pour le .htaccess en cours. Mais ensuite, la "nouvelle" url va être ré-examinée par le moteur du serveur qui analyse les url, et donc éventuellement repasser (ou pas) dans l'ensemble du .htaccess qu'il vient de quitter. Voir par exemple à https://httpd.apache.org/docs/2.4/fr/rewrite/flags.html le chapitre L|last.

Amicalement,
Bien le serveur me renvoie la page 404 lorsque je saisie une url comprenant un caractère non prix en charge ("." "/" etc). Mais bon peu importe.

Actuellement mes urls sont toutes www.monsite.com/index.php?page=xxx.
Lorsqu'un visiteur clic sur about du menu par exemple, l'url présente dans sa barre de navigateur est www.monsite.com/index.php?page=about. Pareil pour la page contact, galerie etc. Toutes mes urls sont de type index.php?page=xxx de par mon code php dans le <body> de mon index.php.
Alors oui, les visiteurs n'ont pas à saisir cette information, mais lorsqu'ils navigueront sur le site, il verront dans la barre d'urls que toute mes pages sont incluses dans un index. Et je voulais "cacher" ça en ne renvoyant dans l’écriture de l'url (donc visible par l'internaute) des pages de type ww.monsite.com/xxx
C'est vraiment du pinaillage en fait j'en suis conscients, je cherche simplement à avoir des urls plus "friendly", je pensais naïvement que ça ne devait pas poser de problèmes après les recherches que j'avais faites. Mais visiblement si, on fera sans Smiley ravi .

Merci pour la doc. A mettre à chaque fin de ligne d'une règle donc.
Modérateur
Bonjour,

À ta place je remplacerais les liens internes par les nouvelles url. Ça n'a pas trop de sens de conserver les anciennes url. Et je n'ose imaginer les dégâts en terme de référencement.

Moins il y a de combines, mieux le site se porte.

Amicalement,
Bonjour,
Je n'ai pas trop compris ce que tu me demande de faire par
parsimonhi a écrit :
je remplacerais les liens internes par les nouvelles url. Ça n'a pas trop de sens de conserver les anciennes url.

Là, actuellement, je n'ai rien touché. J'ai les urls générées par mon index.php qui sont index.php?/page=xxx de par mon bout de code du 1er post (avec comme ajout le else que tu m'as fait ajouter).
Modifié par westman (31 Jan 2022 - 15:16)
Modérateur
Bonjour,

Dans le code de tes pages (dans tes menus par exemple) tu as des liens que l'on appelle liens internes et qui permettent de se rendre à d'autres pages de ton site.

Ces liens ne doivent plus être de la forme www.monsite.com/index.php?page=xxx mais être remplacés (dans le code html, pas par une combine dans le .htaccess) par www.monsite.com/xxx (en fait, on peut même se contenter de simplement mettre xxx). Ainsi, l'internaute ne verra pas dans sa barre d'adresse des url du genre www.monsite.com/index.php?page=xxx, mais bien des url du genre www.monsite.com/xxx.

Par exemple, le code html
<a href="www.monsite.com/index.php?page=about">À propos</a>
doit être remplacé (avec un éditeur de texte) par
<a href="about">À propos</a>


Il faut laisser par ailleurs dans le .htaccess les RewriteRule qui vont permettre au serveur, quand celui-ci va voir un lien de la forme www.monsite.com/xxx dans le code d'une page, de construire la page demandée en exécutant le code de www.monsite.com/index.php?page=xxx.

Amicalement,
Modifié par parsimonhi (31 Jan 2022 - 16:35)
Ok, voici actuellement la structure de mon index:
<body>
<header>
        <nav id="hamnav">
            <input type="checkbox" id="checkbox1" class="checkbox1 visuallyHidden">
            <label for="checkbox1">
                <div class="hamburger hamburger1">
                    <span class="bar bar1"></span>
                    <span class="bar bar2"></span>
                    <span class="bar bar3"></span>
                    <span class="bar bar4"></span>
                  </div>
            </label>
            <div id="hamitems">
                 <a href="index.php?page=home" class="home" name="home">HOME</a>
                 <a href="index.php?page=gallery" class="gallery" name="gallery">GALLERY</a>
                 <img id="img-logo" src="design/headerlogo.png" alt="logo"/>
                 <a href="index.php?page=about" class="about" name="about">ABOUT</a>
                 <a href="index.php?page=contact" class="contact" name="contact">CONTACT</a>
            </div>
    </nav>
</header>
        <?php
        if (isset($_GET['page'])){
            $page = $_GET['page'];
            $template = 'pages/'.$page.'.phtml';
            if (file_exists($template)){
                include $template;
            }else{
                include 'home.phtml';
            }
        }
        else include 'pages/home.phtml';
        ?>
<footer>...</footer>
</body>

Donc le "renomage" de mes urls, je dois passer par les hrefs de mon div hamitems? Ça m'arrangerai en fait Smiley lol . J'ai repris le tuto mvc plus ou moins tel quel donc j'ai conservé la notation de base qui y était présente.
Modifié par westman (31 Jan 2022 - 19:30)
Modérateur
Bonjour,

Ton div hamitems devrait désormais être :
            <div id="hamitems">
                 <a href="home" class="home" name="home">HOME</a>
                 <a href="gallery" class="gallery" name="gallery">GALLERY</a>
                 <img id="img-logo" src="design/headerlogo.png" alt="logo"/>
                 <a href="about" class="about" name="about">ABOUT</a>
                 <a href="contact" class="contact" name="contact">CONTACT</a>
            </div>
Amicalement,
Ok merci Smiley smile .
Ça fonctionne parfaitement grâce au .htaccess. J'ai enfin compris la manip Smiley biggol .
Modifié par westman (31 Jan 2022 - 20:39)
Par contre, a force de bidouiller, je me rends compte que j'ai quelques petits soucis d'arborescence.
Lorsque dans ma barre d'url je tape:
monsite.com/qsdfa
j'ai bien ma page page-not-found.phtml.
monsite.com/home*$^
j'ai bien ma page error404.html perso qui est chargé.

Par contre, si j'entre:
monsite.com/home/
ou:
monsite.com/qsdfa/
Là, c'est le drame. J'ai ma page 404 perso mais sans mon css:
https://i.imgur.com/CaYYvKn.jpg
et pareil, lorsque je saisis:
monsite.com/gallery/ au lieu de monsite.com/gallery
là, l'internaute a accès à mon arborescence plutôt qu'à une page d'erreur:
https://i.imgur.com/mt9aqPP.jpg

Je vais repasser à du statique plutôt que mon template mvc . Ça sera moins de galères de faire des copier coller Smiley biggol .
Plus sérieusement, à part revenir avec mes urls d'index.php?page=xxx ainsi que leurs mentions dans les href, et dégager le .htaccess et faire sans ce fichier, je vois pas trop de solutions.
Modifié par westman (01 Feb 2022 - 01:49)
Modérateur
Bonjour,

westman a écrit :
Par contre, a force de bidouiller, je me rends compte que j'ai quelques petits soucis d'arborescence.
Lorsque dans ma barre d'url je tape:
monsite.com/qsdfa
j'ai bien ma page page-not-found.phtml.
monsite.com/home*$^
j'ai bien ma page error404.html perso qui est chargé.

Ça devrait être la même page dans les deux cas. Tu as simplement une erreur de logique dans ton code et/ou une erreur dans ton .htaccess.
1) À quel endroit tu envoies l'internaute vers la page page-not-found.phtml ? dans le index.php ? dans le .htaccess ?
2) À quel endroit tu envoies l'internaute vers la page error404.html ? dans le .htaccess ?
Il faut spécifier la même page à ces deux endroits, car du point de vue de l'internaute, c'est la même chose. Et pour bien faire, il faudrait se débrouiller pour aussi générer un code d'erreur 404 dans le cas où c'est actuellement page-not-found.phtml qui est affichée.

westman a écrit :
Par contre, si j'entre:
monsite.com/home/
ou:
monsite.com/qsdfa/
Là, c'est le drame. J'ai ma page 404 perso mais sans mon css:
https://i.imgur.com/CaYYvKn.jpg
et pareil, lorsque je saisis:
monsite.com/gallery/ au lieu de monsite.com/gallery
là, l'internaute a accès à mon arborescence plutôt qu'à une page d'erreur:
https://i.imgur.com/mt9aqPP.jpg

Quand on entre une adresse finissant par /, le serveur cherche en fait dans un sous-dossier un index.php ou index.htm ou index.html selon ce qui est spécifié dans le .htaccess. C'est une ligne du genre :
DirectoryIndex index.php index.html index.htm
L'url recherchée serait donc par exemple monsite.com/qsdfa/index.php qui évidemment n'existe pas (parce qu'il n'y a pas de dossier qsdfa). Et c'est donc normal d'avoir une erreur 404 dans ce cas. Si la page d'erreur 404 n'a pas de css, il faudrait regarder dans le code. Ça doit juste être une question de chemin vers le fichier css qui est trouvé dans certains cas et pas dans d'autres (où est ton css ? où est ta page d'erreur 404 ? comment est-elle fabriquée ?)

Pour ce qui concerne monsite.com/gallery/, comme c'est un "vrai" répertoire, le serveur cherche quelque chose du genre monsite.com/gallery/index.xxx, et comme il ne le trouve pas, il affiche la liste de ce qu'il y a dans le répertoire. C'est le comportement normal par défaut. Là aussi, ça peut se gérer dans le .htaccess en rajoutant l'option -Indexes (que tu devrais mettre même si tu ne fais pas d'url rewritting soit dit en passant). Tu dois donc dans ton .htaccess remplacer
Options +FollowSymlinks
par
Options +FollowSymlinks -Indexes

westman a écrit :
Je vais repasser à du statique plutôt que mon template mvc . Ça sera moins de galères de faire des copier coller Smiley biggol .
Plus sérieusement, à part revenir avec mes urls d'index.php?page=xxx ainsi que leurs mentions dans les href, et dégager le .htaccess et faire sans ce fichier, je vois pas trop de solutions.
Je ne suis pas un grand fan des url rewritting, mais maintenant que tu as fait tout ce chemin, ce serait dommage de revenir en arrière. Smiley cligne

Amicalement,
Modifié par parsimonhi (01 Feb 2022 - 03:51)
J'ai naïvement essayé de changer le php de mon index pour renvoyer à ma pagenotfound :
        if (isset($_GET['page'])){
            $page = $_GET['page'];
            $template = 'pages/'.$page.'.phtml';
            if (file_exists($template)){
                include $template;
            }else{
                include 'pages/page-not-found.phtml';
            }
        }
        else include 'pages/home.phtml';
        ?>

et mon .htacces:
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^([A-Za-z0-9_-]*)$ index.php?page=$1 [L]
ErrorDocument 404 /error404.html

Mon arbo plus détaillée:
/root
    index.php
    .htaccess
    error404.html
    /css
        style.css
    /js
        script.js
    /pages
        page-not-found.phtml
        home.phtml
        about.phtml
        contact.phtml
        ...

dans mon <head> de error404.html
<link rel="stylesheet" href="css/style.css">

j'ai hésité a embarquer le css dans la page. Ça me paraissait plus logique d'avoir ma page d'erreur autonome. Puis finalement j'ai gardé mon architecture plutôt que d'avoir des doublons de style sur les boutons, les h etc.

Je vais attendre tes retours avant de tout bidouiller haha.
Modifié par westman (01 Feb 2022 - 14:49)
Modérateur
Bonjour,

1) Pour l'insertion du css dans la page error404.html, tu peux essayer de mettre un / devant css/style.css
<link rel="stylesheet" href="/css/style.css">
Ça devrait permettre de "trouver" le fichier css quelque soit l'endroit où on se trouve dans l'arborescence du site. Il faudra faire de même si tu affiches des images dans cette page (faire précéder leur chemin par un /).

2) Tu peux laisser dans index.php ton include 'pages/page-not-found.phtml'; si tu veux. Mais tu peux peut-être changer le nom du fichier error404.html en error404.php (et évidemment corriger le .htaccess en conséquence), et dedans ajouter par exemple :
<?php include $_SERVER['DOCUMENT_ROOT']."/pages/page-not-found.phtml";?>
Alors tu devrais avoir le même contenu dans tous les cas où une page sera non-trouvée.

3) Pour le .htaccess, il faudrait donc comme je l'écrivais dans mon post précédent, rajouter l'option -Indexes pour empêcher l'affichage de la liste des fichiers contenus dans un répertoire. Il faudrait aussi rajouter le traitement de l'erreur 403 qui signifie "Accès interdit", et créer la page error403.php qui le signalera (même modèle que la page error404.php, mais en mettant "Accès interdit" au lieu de "Page non trouvée").
Options +FollowSymlinks - Indexes
RewriteEngine on
RewriteRule ^([A-Za-z0-9_-]*)$ index.php?page=$1 [L]
ErrorDocument 403 /error403.php
ErrorDocument 404 /error404.php

4) S'il n'y a pas de ligne
DirectoryIndex index.php index.html index.htm
dans ton .htaccess, mais que ça marche déjà, tu n'as pas à t'en pré-occuper. Ton serveur a sans doute déjà la configuration appropriée.

Amicalement,
Modifié par parsimonhi (01 Feb 2022 - 18:24)
Yes, tout fonctionne, il ne me reste plus qu'un problème de par mon
include 'pages/page-not-found.phtml';

C'est que monsite.com renvoi une erreur 404 (normal) et non sur monsite.com/home, au passage l'url est fancy:
monsite.com/homehomehomehome[...]home

Donc soit je repasse sur un include home et du coup même lorsqu'il y a une erreur de saisie, tout est redirigé sur /home et je peux supprimer ma page-not-found.phtml. Soit je dois ajouter une nouvelle règle a mon .htaccess et là... Encor une fois après quelques tests.... Smiley biggol
Modérateur
Bon,

Pour le cas où c'est monsite.com qui est au départ dans l'url, il faut modifier le index.php en testant si $_GET['page'] est "vide", et si c'est le cas, il faut inclure 'pages/home.phtml'.

Exemple :
if (isset($_GET['page'])) {
    $page = $_GET['page'];
    if(!$page) include 'pages/home.phtml';
    else {
    	$template = 'pages/'.$page.'.phtml';
    	if (file_exists($template)) include $template;
    	else include 'pages/page-not-found.phtml';
    }
}
else include 'pages/home.phtml';
Amicalement,