Pages :
Bonjour,

Afin de vous donner une idée de l'incongru qui débarque dans votre communauté, voici le topo me concernant : http://forum.alsacreations.com/topic-9-23-64-Sujet-unique-Le-sujet-des-presentations.html#p343344

Comme promis donc, j'attaque :
Question 1. J'ai actuellement un menu vertical qui se répète sur toutes les pages de mon site. J'ai le sentiment que Google aime bien car depuis que je l'ai mis en place de cette manière, mon référencement s'est grandement amélioré. La question est donc la suivante : le fait d'utiliser la fonction "include" pour mon menu (stocké dans un "menu.php" unique) va-t'il avoir une influence sur le référencement (vu que les entrées de menu ne sont plus en dur sur chaque page) ? Ou bien le bot des moteurs "voit-il" la page telle qu'elle s'affiche lorsqu'on utilise l'affichage du code source de la page via un navigateur ?

Question 2. J'ai commencé à faire un test avec include pour mon menu. J'ai renommé ma page .html en .php, ajout de "<?php header( 'Content-Type: text/html; charset=UTF-8' ); ?>" en début de fichier, suppression tout ce qui est <ul id="menu_general">...</ul> dans la page et remplacement par <?php include('menu.php'); ?> qui lui contient exclusivement <ul id="menu_general">...</ul> (je dis bien exclusivement : il n'y a strictement pas une seule autre ligne dans ce fichier).
Lorsque j'ouvre cette page de test, l'affichage dans le navigateur est OK. Ma question est la suivante : est-ce un code correct ?

Merci pour votre aide
Modifié par Black Hole Sun (23 Jun 2010 - 11:43)
Bonjour,

Le PHP est un langage côté serveur utilisé pour générer du code HTML. Donc que ta page soit en PHP ou en HTML, cela reste de l'HTML pour le navigateur et donc pour les robots.

La fonction PHP include() ne fait qu'un simple copié collé du fichier appellé "dans" le code du fichier appellant et envoie le tout au navigateur.

L'utilisation d'include pour gérer les portions statiques d'une interface (menu, header, footer...) est une très bonne pratique, mais je ne pense pas que cela ait un quelconque impact sur ton référencement.
Salut,

Dès l'instant ou ton code respecte la syntaxe du langage choisi (html 4, xhtml 1.0, etc.), il n'y a aucune raison que ton code soit incorrect. Si tu veux t'en assurer, tu peux utiliser le validateur du W3C. Smiley smile
Merci pour vos réponses.

Laurie-Anne : j'ai bien relu et je viens de mieux comprendre ta réponse à ma question 2. Mes compétences balbutiantes n'avaient pas mesuré le poids de chacune de tes phrases.
Maintenant j'ai compris Smiley cligne

Mikachu : idem, je n'imaginais pas que le validateur W3C me permettrait encore de vérifier mon code. Mais c'est parfaitement logique suite à la réponse de Laurie-Anne et la tienne.

Du coup, je m'aperçois que la synthaxe pour l'insertion du logo/lien fourni par Hit-Parade n'est pas respectueuse du standard.
Vu comme ça me sert, je les vire Smiley fache
Y'a pas à dire, ça me plait énormément ce php : j'y prends vraiment goût Smiley murf
Mais comment j'ai pu me casser autant la tête à recopier des pans entiers de code pour les avoir sur toutes les pages alors que la solution était si simple ? Non mais franchement ...
Passons.

Question 4.
Chaque page de mon site existe en double :
- une page.php et son pendant page_US.php
(Je connais le principe des fichiers *.po, mais après mûre réflexion, je ne souhaite pas le mettre en place sur mon site. C'est avant tout du rédactionnel pur avec peu de recurrences.)

Donc, je vais conserver les doubles versions FR/US. La synthaxe d'URL est toujours la même : une US est toujours page_US.

J'ai ce code pour laisser un utilisateur passer de l'une à l'autre facilement :
<div style="text-align: right; font-weight: bold; font-style: italic;">
<a href="index_US.html" rel="me"><span style="color: rgb(255, 255, 0);">
<img style="border: 0px solid ; width: 22px; height: 12px;" alt="English version" src="Flag_US.gif" vspace="2" />Click here for the English version </span></a>
<a href="index_US.html" rel="me">
<span style="color: rgb(255, 255, 0);"><img style="border: 0px solid ; width: 22px; height: 12px;" alt="English version" src="Flag_US.gif" vspace="2" /></span></a>
<a href="index_US.html" rel="me"><span style="color: rgb(255, 255, 0);"></span></a></div>


En l'état, impossible d'utiliser "include" language.php puisque le code change pour chaque page.
Je voudrais donc savoir s'il existe une fonction php qui permettrait que ce code s'auto-génère en fonction du nom de la page.
En clair, que le code ressemble à une formule de ce type :
url_US = url en cours avec "_US" positionné avant .php

Donc très clairement, pour simplifier la question, la chose va donc s'opérer au niveau de ça :
<a href="index_US.html" rel="me">


Question 5.
J'ai beaucoup de liens sur des sites externes qui renvoient sur telle ou telle page de mon site. Donc avec les url en .html
Pour le passage en php de mon site, et pour ne pas utiliser "AddType application/x-httpd-php .html" dans le htaccess (pratique mais peu élégant je trouve), est-ce qu'il existerait un moyen soit via la gestion du nom de domaine, soit via l'htaccess de spécifier une redirection de ce type : *.html = *.php


Promis, après j'arrête pour un moment parce que là, j'ai déjà un gros boulot à faire pour intégrer toutes ces nouveautés à mon site Smiley confused
Pour ta question 4 : il est possible de récupérer l'URL de la page en cours avec PHP, grace à la variable $_SERVER[] (je te laisse fouiller la doc pour trouver la syntaxe exacte).

Pour ta question 5, je ne comprends pas la question, ni vraiment son but. Il est tout à fait possible de passer d'une page php à une page html.
Black Hole Sun a écrit :


Question 5.
J'ai beaucoup de liens sur des sites externes qui renvoient sur telle ou telle page de mon site. Donc avec les url en .html
Pour le passage en php de mon site, et pour ne pas utiliser "AddType application/x-httpd-php .html" dans le htaccess (pratique mais peu élégant je trouve), est-ce qu'il existerait un moyen soit via la gestion du nom de domaine, soit via l'htaccess de spécifier une redirection de ce type : *.html = *.php


L'urlrewriting peut-etre utile et simple a mettre en place .
un fichier htaccess avec ceci dedans :
RewriteEngine on
RewriteRule ^([^/\.]+).html?$ $1.php?%{QUERY_STRING} [L]


et toute les pages appele avec l'extension html seront en fait des page avec l'extension .php sur ton hebergement.

Tu devras renommé toutes tes pages en .php , coté navigateur , que tu appel index.html ou index.php , ce sera toujours index.php qui sera affiché et le fichier index.html ne sera jamais affiché.

si tu as par exemple 'page.html' sur ton site et pas de 'page.php' , ta regle de réecriture ne permettra pas d'atteindre cette page .

Pour le navigateur tu peut donc avoir 2 adresses pour la même page : extension html ou php . Attention donc de ne te servir que de l'une pour ne pas faire de 'duplicate content' .

Si google a referencer ton site en html , ne change rien au lien internes et ne perturbe pas tes liens externes si tu opte pour l'urlrewriting .

Pour : AddType application/x-httpd-php , les hebergements ne sont pas toujours clairs sur la config/syntaxe et parfois l'interdisent tout simplement .

Les fonction que Laurie-Anne t'indique peuvent t'etre utile et te permettre par exemple de gerer les pages d'erreurs avec des redirections sur des pages plus appropriées (il y avait eu un concours sur les pages 404 sur alsacréations , ça peut t'aider a en comprendre l'utilité )

GC
Laurie-Anne a écrit :
Pour ta question 4 : il est possible de récupérer l'URL de la page en cours avec PHP, grace à la variable $_SERVER[] (je te laisse fouiller la doc pour trouver la syntaxe exacte).

Tu peux aussi, dans chaque page, déclarer des variables dont tu te sers dans les fichiers inclus pour altérer le rendu. Par exemple:
<?php
$pageTitle = 'Titre de ma page';
$pageCategory = 'some-category';
$pageLanguage = 'fr';

include('inc/header.php');
include('inc/language.php');
include('inc/nav.php');
?>

Contenu de la page

<?php
include('inc/footer.php');
?>

Et dans chaque fichier inclus, tu peux maintenant tester la valeur de ces variables pour afficher un contenu anglais ou français, utiliser $pageTitle pour remplir le <title> et $pageLanguage pour remplir la valeur de l'attribut lang (<html lang="...">), etc.
Ce n'est bien sûr qu'un exemple.

Par contre pour que ça soit gérable, ça demande de prévoir à l'avance les variables dont tu auras besoin. Si tu as 300 pages et que tu dois rajouter une variable avec une valeur sur chacune des 300 pages après coup, ça peut être pénible.
Il y a aussi des versions plus évoluées de cette astuce. Et des variantes en utilisant un script principal et de l'URL rewriting.
OK. Merci pour vos réponses.
Pour le point 4., il me semble préférable de faire cette génération automatique d'URI directement dans chaque page car je ne sais pas encore toutes les variables que je vais vouloir déclarer dans chacune (je débute donc je découvre les possibilités au fur et à mesure que je progresse).

Donc, il me faut cette variable :
<?php
echo $_SERVER['REQUEST_URI'];
?>

et j'obtiens bien /page.php

J'obtiens ce même résultat avec SCRIPT_NAME mais d'après ce que je comprends, l'usage de URI serait plus logique dans mon cas : correct ?

En revanche, je ne trouve pas quelle synthaxe complémentaire utiliser pour que le '/' initial disparaisse (encore qu'après test, '/page2.php' et 'page2.php' fonctionnent), mais surtout pour que ça insère '_US' avant l'extension '.php'

Pour le point 5. la solution proposée par gc-nomade est parfaite. Google a effectivement tout référencé en html donc je vais laisser tous mes liens internes dans ce format et simplement renommer chaque page en .php Du même coup, ça résoud la problématique pour les autres sites qui pointent sur les url complètes de mon site en .html
Seules les nouvelles pages que je créerai à l'avenir seront directement en php avec liens internes en php.

Toutefois, j'ai besoin d'une exception à cette règle d'url-rewriting : certaines pages de mon site doivent impérativement être laissées en .html et rester accessibles de cette manière. Pour faire court, c'est une obligation morale que je m'impose en refusant de toucher à quoi que ce soit des ces pages qui doivent rester dans leur état originel.

J'ai donc trouvé un code à insérer dans le htacess et je l'ai adapté. Ce qui donnerait la chose suivante en l'intégrant avec la solution de gc-nomade :
RewriteEngine on

RewriteRule ^([^/\.]+).html?$ $1.php?%{QUERY_STRING} [L]

RewriteCond %{REQUEST_URI} !^/classic
RewriteRule ^([^/\.]+).html?$ $1.html?%{QUERY_STRING} [L]


est-ce correct ?
Bonjour,

Pour pouvoir modifier le nom de la page pour inclure _US avant PHP, il va falloir utiliser les fonction d'édition de texte.

Je ne me souviens pas des noms de fonction exact (et n'ai pas le temps de rechercher là tout de suite maintenant) mais l'idée c'est de calculer le nombre de lettre du nom de la page, puis de faire un substr (substring) en partant de 1 (la lettre juste après /) jusqu'à longueur-5 (taille du nom, moins le / et moins ".php").

Ensuite tu peux rajouter _US.php

normalement ça doit donner :

<?php
   $pageUS = substr($_SERVER['REQUEST_URI'];1;strlen($_SERVER['REQUEST_URI'])-5)."_US.php";
?>
Bonjour Laurie-Anne,

Merci pour ta réponse.
Mes noms de page ayant des longueurs très variables, une recherche sur 'substr' m'a permis de voir qu'on peut compter le nombre de lettres à partir de la fin en utilisant des valeurs négatives (ce qui m'intéresse donc puisque l'extension est le seul nombre de lettres constant dans mes URI).

Donc à partir de ça : string substr ( string $string , int $start [, int $length ] )
et de ce que tu m'indiques, j'adapte comme ça mais j'obtiens une erreur :

<a href="<?php $pageUS = substr($_SERVER['REQUEST_URI'];-1;strlen($_SERVER['REQUEST_URI'])-4).'_US.php'; ?>" rel="me">


Les codes couleurs de mon éditeur (gedit) me montrent qu'il y a un problème sur la fin de la synthaxe. Donc en remplaçant les " par ' pour entourer _US.php, ça résoud le problème au niveau des couleurs. Mais dans tous les cas, je me retrouve avec :
Parse error: syntax error, unexpected ';' in /home/bhs/test/index.php on line 33

Par ailleurs, si je comprends bien la synthaxe, je demande l'ajout de "_US.php" à mon URI en "page.php". Mais je lui demande "page_US.php.php" au lieu de "page_US.php" non ?

Edit : je viens de me rendre compte que la dernière phrase est totalement fausse Smiley nimp Substitute string c'est pas un simple ajout mais un remplacement.
Modifié par Black Hole Sun (10 Jun 2010 - 14:43)
Je viens de résoudre en partie mon problème (n'en doutez pas, vous assistez à un miracle Smiley lol )

J'ai remplacé la fonction substr par substr_replace, des ; par des , et les "" c'est parce que je n'ai pas trouvé quel argument lui passer donc je me suis dit que "" ne passerait rien (car il fallait un argument sinon erreur).
Après une bone 50aines d'essais Smiley wingol voici mon code :

<?php
echo $pageUS = substr_replace($_SERVER['REQUEST_URI'],"",strlen($_SERVER['REQUEST_URI'])-4).'_US.php'; ?>


Et ça m'affiche bien /index_US.php
J'ai testé avec une URI qui comporte plus de lettres et ça fonctionne aussi (trop fier Smiley cool ).

En revanche, petit problème assez bête : si je suis sur la racine de mon site (donc sans indiquer /index.php dans l'url), j'affiche bien ma page d'index (logique) ... mais mon code ne me renvoie alors que '_US.php'
Somme toute, c'est logique puisque l'URI de la page n'est pas nommément index.php mais / (qui par la grâce du grand manitou de l'informatique envoie automatiquement sur index.php à l'insu de notre plein gré).
Forcément, c'est la seule et unique page qui va poser ce problème pour tout mon site, et s'il faut monter une usine à gaz pour le contourner, je saurai faire une exception puisque le code fonctionne pour tout le reste.

Dernier problème : impossible d'insérer ce code comme ça :
<a href="<?php $pageUS = substr_replace($_SERVER['REQUEST_URI'],"",strlen($_SERVER['REQUEST_URI'])-4).'_US.php'; ?> rel="me">
Logiquement, la même en sens inverse (ie pour passer de page_US.php à page.php)

<?php echo $pageUS = substr_replace($_SERVER['REQUEST_URI'],"",strlen($_SERVER['REQUEST_URI'])-7).'.php'; ?>


Et au passage, j'ai trituré le truc pour arriver à l'intégrer comme lien cliquable :
Code de page.php à page_US.php
<a href="<?php echo $pageUS = substr_replace($_SERVER['REQUEST_URI'],'',strlen($_SERVER['REQUEST_URI'])-4).'_US.php'; ?>"> blabla</a>


Et le même en sens inverse de page_US.php à page.php :
<a href="<?php echo $pageUS = substr_replace($_SERVER['REQUEST_URI'],'',strlen($_SERVER['REQUEST_URI'])-7).'.php'; ?>"> blabla</a>


Les deux pages passent la validation W3C, mais j'aimerais une confirmation parce que j'estime avoir un peu fait de la bidouille (notamment avec les " qui me gênaient et que j'ai remplacé par des ' )
Black Hole Sun a écrit :

J'ai donc trouvé un code à insérer dans le htacess et je l'ai adapté. Ce qui donnerait la chose suivante en l'intégrant avec la solution de gc-nomade :
RewriteEngine on

RewriteRule ^([^/\.]+).html?$ $1.php?%{QUERY_STRING} [L]

RewriteCond %{REQUEST_URI} !^/classic
RewriteRule ^([^/\.]+).html?$ $1.html?%{QUERY_STRING} [L]


est-ce correct ?


j'ai plutôt l'impression que ta premiere regle sera toujours prise en compte pour un fichier html .

tu peux faire plus simple en fait :

Ce qui te donne un fichier htaccess encore simple :


1) teste si le fichier demander n'existe pas
2) si pas de fichier , alors on tente la regle de réecriture.
+ 3) pense eventuellement a gerer tes pages d'erreurs
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/\.]+).html?$ $1.php?%{QUERY_STRING} [L]


Maintenant tu te retrouve avec la possibilté d'acceder a un fichier html si il existe , si il n'existe pas , le serveur tenteras d'acceder au fichier php ... et si celui-ci n'existe pas , a toi de voir coment tu veut gerer ou personnalisé ta page 404 .

++
Je viens de faire le point avec ce que vous m'avez appris : le bilan est très positif parce que j'apprends, mais il n'est pas rose à cause des contraintes que je me suis imposé.

Donc, je change mon fusil d'épaule pour gagner en simplicité : passage intégral en .php pour toutes les pages de mon site. Y compris la partie "moralement pas touchable".
Je m'excuse de vous avoir sollicité pour des solutions à des particularités que j'ai décidé de supprimer : c'est la qualité de vos réponses qui m'ont fait prendre conscience que je devais standardiser mon approche au lieu de poursuivre dans une démarche conservatrice menant à une usine à gaz.

Je vais travailler 1 fois à passer en revue l'intégralité de mes pages pour modifier tous mes liens internes en .html vers .php Et je compte sur la fréquence des visites des googlebot pour réindexer le machin. Et si j'y perds temporairement, mes lecteurs habitués sauront me retrouver.

Toutefois, je ne contrôle pas les liens pointant vers mon site depuis des sites externes (site référents) : eux sont et resteront en .html
Il me faut donc une redirection permanente de html vers php pour ne pas laisser mes visiteurs en rade s'ils suivent un lien référents ou un bookmark de leur navigateur.

En me basant sur ça : http://alexandre.alapetite.fr/doc-alex/redirections/index.fr.html#cgext
j'en déduis ce code :
Redirect permanent ^/(.*)\.html$  http://www.monsite.fr/$1.php

Toute page .html demandée sur mon site sera donc automatiquement renvoyée sur la même page mais en .php
Au niveau synthaxe, j'ai également trouvé RedirectPermanent : laquelle est correcte ?

J'ai également trouvé ça, mais je ne comprends pas la différence avec le code précédent :
RedirectMatch 301 (.*)\.html$  http://www.monsite.fr$1.php


Toutefois, une partie des pages de mon site ne se trouvent pas sur la racine (ce que j'ai appelé "intouchable"). Elles sont dans un dossier et je voudrais pouvoir les y laisser (pour qu'elles restent bien "à part" du reste de mon site).
Concrètement, les pages de cette section sont du type http://www.monsite.fr/classic/page01.html
Elles passeront donc en http://www.monsite.fr/classic/page01.php

D'après le code précédent, je crois comprendre qu'un lien référent pointant sur http://www.monsite.fr/classic/page01.html sera redirigé sur http://www.monsite.fr/page01.php, c'est à dire à la racine de mon site ... où ne se trouvera pas la page en question.

Détail qui me semble avoir son importance mais que je n'arrive pas à exploiter pour trouver une solution : toutes les pages contenues dans /classic/ ont toutes un nom commençant par "xxx" et sont à ce titre uniques sur mon site (ie, toutes les autres pages de mon site ont des noms qui ne commencent/commenceront jamais par "xxx").

Merci pour votre aide, et encore désolé de ma prise de conscience tardive.
Pour la différence entre les deux versions. Tu n'as pas la même expression régulière.

^/(.*)\.html$ dans la première contre (.*)\.html$ pour la deuxième. Ce n'est pas la même chose!

La première peut être traduite par: commence par / suivi de (n'importe quoi) et terminant par .html.
La deuxième peut être traduite par: (n'importe quoi) et terminant par .html.

Selon mes propres .htaccess l'expression devrais plutôt être ^(.*)\.html$.
Qui se traduit en: commence par (n'importe quoi) et se termine par .html. De cette façon tu est certain d'inclure la totalité de l'adresse dans ta variable. Et je crois bien que cela va garder les dossiers.

Donc selon moi:

Redirect permanent ^(.*)\.html$  $1.php [L]
ou
RedirectMatch 301 ^(.*)\.html$  $1.php [L]

Par contre je ne sais pas lequel est le mieux entre Redirect permanent et RedirectMatch 301.
ok, merci pour ta réponse.
la logique veut qu'effectivement mon expression régulière soit commence par n'importe quoi donc ^(.*)\.html$

Reste donc à déterminer laquelle est la mieux entre Redirect permanent (ou RedirectPermanent ? j'ai vu les 2 synthaxes) et RedirectMatch 301. La première me semble la plus logique car la seconde semble indiquer un changement de contenu si j'ai bien compris (ce qui n'est pas mon cas).

Pour l'exception concernant les pages .html de mon dossier /classic qui ne doivent pas être redirigées, j'ai cru comprendre qu'un .htaccess est récursif. J'ai aussi lu qu'un .htaccess placé dans un dossier peut changer la règle fixée dans le dossier parent (ici la racine).
Dans /classic, le .htaccess serait donc
Redirect permanent ^(.*)\.html$  $1.html [L]


(avec la même interrogation -et la même réponse- entre Redirect permanent et Redirect Match 301).

Pour la partie de mon site dans /classic, je crois que je vais tout simplement faire un test demain et voir ce que ça donne Smiley rolleyes
bonsoir,

juste pour te rappeller que si tu redirige une requete page.html vers page.php , dans le navigateur et pour le moteur de recherche il s'agit toujours de page.html . la redirection 301 est inutile et c'est logique : remplacer : www.monsite.com/page.html par www.monsite.com/page.html ne sert pas a grand chose . il n'ya que ton serveur qui selon la regle ira chercher : page.php .

Une redirection 301 n'a d'interet que lorsque l'adresse change dans la barre d'adresse ou pour les moteur de recherche (ou bien que tu renvoi son contenu dans une page d'un autre nom) .

(desolé je reprend mon exemple corrigé avec la bonne remarque de Gizz ):


RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)\.html?$ $1.php?%{QUERY_STRING} [L]


et
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)\..html?$ $1.php?%{QUERY_STRING} [L,301]


ne fait aucune difference et la redirection 301 du second est quasi inutile .

scenario:

1) je demande index.html : elle existe donc elle s'affiche

2) je demande index.html mais elle n'existe pas car réecrite en index.php : index.html s'affiche selon la requete de mon navigateur (alors que le serveur nous sert index.php).

3) je demande index.html , elle n'existe pas et index.php non plus : j'ai le droit a une page d'erreur car , pour le navigateur et selon la regle appliqué par le serveur index.html n'existe pas .

4) je demande index.php qui existe et s'affiche ... oups , si je demande index.html elle existera aussi virtuellement de par ma regle et elle sera identique a index.php .

4) pose un probleme si tu grades deux version d'un fichier du m^me non avec les deux extensiosn, mais si tu ne souhaite annuler la regle que dans un seul dossier , il te suffit toujours de tester que le ficher demandé existe ou pas :

en gros depuis la racine tu oblige le passage html vers php (uniquement pour le serveur ) avec :

RewriteEngine on
RewriteRule ^(.*)\.html?$ $1.php?%{QUERY_STRING} [L]

et dans le dossier /classic:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f

va simplement annuler la regle : html -> php

si tu veut garder les deux possible dans ce repertoire et sous repertoires :
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.html?$ $1.php?%{QUERY_STRING} [L]


( Comme je ne maitrise pas toujours bien la porté des regex de l'urlrewriting et que un bouclage infini est toujours probable , je suis partisan des regle les plus simples possibles et qui se stoppent sitot que possible .. a tord ou a raison )

GC
Pages :