web-dev-qa-db-fra.com

Est-il acceptable pour le référencement d'envoyer un statut 200 lorsque je réécris la demande à un contrôleur, puis que le contenu est exporté de manière dynamique?

Après avoir lu d'innombrables pages sur les redirections et les meilleures pratiques, je ne sais toujours pas si ce que je fais ici est bon, mauvais ou indifférent en ce qui concerne le référencement.

J'ai une table dans une base de données qui contient diverses URL - certaines sont des redirections directes vers lesquelles les pages ont été déplacées, et d'autres sont destinées à la traduction d'URL conviviales.

La logique de ma configuration:

  • Si le fichier ou le répertoire n'existe pas, envoyez la demande à controller.php
  • Le contrôleur vérifie si l'URL de la demande existe dans la base de données
  • Si c'est le cas et qu'il ne s'agit que d'une URL conviviale, un en-tête 200 est envoyé et le contenu de la page est généré (sans modifier l'URL conviviale dans la barre d'adresse).
  • S'il s'agit d'une simple redirection, il envoie un en-tête de redirection 301 à la nouvelle URL (qui sera conviviale et répétera ce processus).
  • S'il ne peut pas être trouvé dans la base de données, il envoie un en-tête 404 et affiche le contenu de la page 404.

Mon .htaccess est comme suit:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !^\/controller\.php$ /controller.php [L,NC]

et mon controller.php est comme suit:

$originalURI = $_SERVER['REQUEST_URI'];

$controller = new Controller($originalURI);

if($controller->GetRedirectAddress())
{
    // will output either 200 or 301 status code depending on type of link
    header($_SERVER["SERVER_PROTOCOL"] . " " . $controller->httpStatusText, true, $controller->httpStatusCode);
    echo $controller->OutputRequestToPage();
}
else
{
    header($_SERVER["SERVER_PROTOCOL"] . " 404 Page not found ({$originalURI})", true, 404);
    echo $controller->Output404Page();
}

Le site que je suis en train de mettre à jour a beaucoup de trafic et la dernière chose que je veux faire est d’avoir un impact négatif sur le classement de leurs pages. Tout conseil est donc le bienvenu.

S'il vous plaît laissez-moi savoir si toute information supplémentaire est nécessaire dans les commentaires et je mettrai à jour si nécessaire.

2
Sam

... puis envoie un en-tête 200 et affiche le contenu de la page (sans modifier l'URL dans la barre d'adresse)

Ce que vous faites semble parfaitement correct. Lorsque vous envoyez une réponse valide, un statut 200 OK est la bonne chose à faire. Dans ce cas, il n’ya qu’une seule réponse de votre serveur, alors quel autre code pensez-vous que vous pourriez retourner ici?

Puis-je envoyer un statut 200 lorsque je redirige la demande vers un contrôleur, puis que je produis le contenu de manière dynamique sur une page?

Il peut y avoir un peu de confusion quant à ce qui se passe réellement ici; Qu'est-ce qu'un réécriture interne est réellement? Bien que vous sembliez décrire le processus parfaitement, OK. (Peut-être que le sou a été déposé dans les commentaires?)

  1. L'utilisateur fait une demande à l'une de vos URL conviviales (notez, à proprement parler, elles sont tilisateur amicales, plutôt qu'à des URL conviviales pour le référencement. Les moteurs de recherche ne s'en soucient guère. Bien que je suppose que le "référencement" est un peu un terme générique). example.com/friendly-url.

  2. Étant donné que cette URL ne mappe pas directement vers un fichier ou un répertoire, la demande est réécrite en interne en /controller.php (gérée par votre code .htaccess). Ce motif de conception est appelé "contrôleur frontal". Ceci est entièrement interne à votre serveur. L'utilisateur (ou le moteur du moteur de recherche) ignore complètement ce qui se passe réellement - la complexité nécessaire à la génération de votre page est masquée.

  3. Votre "contrôleur" décide qu'il s'agit d'une demande valide, construit la page et la renvoie au client avec le statut 200 OK. C'est ça, fini. En ce qui concerne le bot client/utilisateur/recherche, il pourrait aussi bien s'agir d'une page HTML statique. (En fait, cela aurait pu être le cas si vous l'aviez extrait tel quel d'un cache de type serveur.)

RewriteRule !^\/controller\.php$ /controller.php [L,NC]

Cependant, votre directive RewriteRule présente quelques problèmes mineurs:

  1. Dans un contexte/.htaccess par répertoire, la RewriteRulemotif (c.-à-d. !^\/controller\.php$) sera toujours réussie. Le chemin d'URL ne correspondra jamais /controller.php, car le préfixe de répertoire est d'abord supprimé avant que le chemin d'URL ne corresponde, de sorte que le chemin d'URL ne commence jamais par une barre oblique. Donc, cela devrait être: !^controller\.php$. Cependant, la boucle de réécriture aurait toujours été empêchée car l'URL aurait traversé sans modification (elle s'arrête juste un peu plus tard). (Il n'y a pas non plus besoin d'échapper aux barres obliques dans la regex, car il n'y a pas de délimiteurs de barres obliques.)

  2. Vous devez supprimer le drapeau NC. Cela permet une correspondance insensible à la casse, comme vous le savez sans doute. Cependant, ceci est appliqué à un motif nié. Vous voulez qu'il réécrive lorsqu'il ne s'agit pas de "controller.php" (exactement), pas s'il ne s'agit pas de "CONTROLLER.PHP" ou de "CoNtRoLlEr.pHp", etc. Peu susceptible de causer un problème, mais cela pourrait et NC est juste plus de travail.

Donc nous avons...

RewriteRule !^controller\.php$ /controller.php [L]
1
MrWhite