Apache: Quelle est la meilleure façon de gérer des milliers de redirections permanentes?

20

Nous avons une liste de 3000 301 redirections. Nous avons besoin d'aide sur

  1. Quel serait le meilleur endroit pour les mettre? Il semble que mettre ces 3000 lignes dans vhost dans httpd.conf serait un gâchis.
  2. Quels sont les moyens recommandés pour gérer des milliers d'URL?
  3. Dans quelle mesure cela va-t-il affecter la vitesse de chargement des pages et la charge du serveur Apache?

Merci.

ucker
la source

Réponses:

29

Vous pouvez utiliser la Includedirective in httpd.confpour pouvoir conserver les redirections dans un autre fichier. Mais ce ne serait pas très efficace, car chaque demande devrait être vérifiée par rapport à de nombreuses expressions régulières. Un redémarrage du serveur serait également nécessaire après chaque modification du fichier.

Une meilleure façon pour autant de redirections serait d'utiliser la directive RewriteMap de type dbmpour déclarer une carte des URI aux redirections. De cette façon, il sera efficace, car les recherches dbm sont très rapides, et après un changement dans la carte, vous n'aurez pas besoin de redémarrer un serveur, car il httpdvérifie l'heure de modification du fichier de carte.

Une règle de réécriture ressemblerait à ceci (testé sur mon ordinateur Fedora 16):

RewriteEngine On
RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.db
RewriteCond ${redirects:$1} !=""
RewriteRule ^(.*)$ ${redirects:$1} [redirect=permanent,last]

Et la carte dbm serait créée à partir d'une carte texte /etc/httpd/conf/redirects.txtressemblant à ceci:

/foo http://serverfault.com/
/bar/lorem/ipsum/ http://stackoverflow.com/

en utilisant une commande

httxt2dbm -f db -i /etc/httpd/conf/redirects.txt -o /etc/httpd/conf/redirects.db
Tometzky
la source
Merci d'avoir répondu. Je l'ai essayé, mais j'obtiens des erreurs: mon contenu de fichier redirects.txt d'une ligne (valeurs séparées par des espaces) mydomain.com/experiment mydomain.com/new_page Cela m'a donné une erreur d'analyse sur la ligne 'RewriteCond $ {redirects: $ 1}! = ""' . Erreur de syntaxe à la ligne 314 de /usr/local/apache/conf/httpd.conf: RewriteCond: mauvais délimiteurs d'indicateur J'ai commenté cela, puis apache a commencé mais visiter mydomain.com/experiment (ou toute autre URL de mon domaine) m'a donné une erreur msgstr "la demande est redirigée d 'une manière qui n'a pas pu être terminée".
ucker
Apache ne redémarre pas avec l'extrait ci-dessus. S'il te plait peux-tu aider? Je ne peux voir aucune erreur liée à cela dans aucun des fichiers journaux.
ucker
J'ai dit qu'il n'avait pas été testé - je m'attendais à ce qu'il ait besoin de quelques ajustements. Je pensais que ce serait suffisant, désolé. Httpd n'a pas démarré car il ne peut pas y avoir d'espace entre !=et ""- j'ai corrigé mon exemple en une version fonctionnelle et testée maintenant.
Tometzky
Un autre commentaire: vous devrez utiliser une approche différente si vos redirections doivent dépendre des chaînes de requête (tout ce qui se trouve après ?dans l'URL), mais c'est également possible . Comme c'est le cas maintenant, il suffit d'ajouter une chaîne de requête à rediriger, par exemple http://yourserver.com/foo?q=bar, rediriger vers http://serverfault.com/?q=bar.
Tometzky
Merci pour la mise à jour. RewriteMap redirects dbm=db:/etc/httpd/conf/redirects.dba donné une erreur RewriteMap dbm type db is invalid. Mais quand je l'ai utilisé, RewriteMap redirects txt:/etc/httpd/conf/redirects.txtcela a fonctionné. Je veux toujours aller de manière hachée comme vous l'avez expliqué au lieu de texte brut. Mais je n'ai pas pu trouver grand-chose sur l'erreur dbm. Merci de votre aide.
ucker
2

J'écrirais un script qui génère un nouveau VHOST avec juste les liens de la liste.

Lucas Kauffman
la source