Comment remplacer le trait de soulignement par un trait avec Nginx

J’utilise Nginx pour la toute première fois et je n’en ai pratiquement aucune connaissance.

Je dois remplacer “_” par “-” dans 100+ URL. J’ai pensé qu’il devait y avoir un moyen facile de faire cela avec Nginx, mais que je ne trouve rien sur Google.

Merci!

Modifier :

Mon url est par exemple: http://www.mywebsite.com/this_category/page1.php

J’ai besoin de cela pour devenir: http://www.mywebsite.com/this-category/page1.php

Non, il n’y a pas de moyen facile de le faire, mais le moteur de réécriture peut néanmoins être forcé de le faire, en supposant que vous pouvez mettre un nombre raisonnable de tirets à convertir dans une seule URL (ou même si vous ne le faites pas). t, voir la fin de la réponse.)

Voici comment je le ferais (code testé):

rewrite ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5-$6-$7-$8-$9; rewrite ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5; rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3; rewrite ^([^_]*)_(.*)$ $1-$2; 

Les quatre réécritures traduisent respectivement les premiers 8, 4, 2 et 1 traits de soulignement dans l’URL en tirets. Le nombre de traits de soulignement dans chaque règle sont des puissances décroissantes de 2 à dessein. Ce bloc est l’ensemble de règles le plus efficace qui va traduire de 0 à 15 occurrences de soulignement dans une seule URL, en utilisant les 16 combinaisons de correspondances ou non correspondant à chaque règle.

Vous remarquerez également que j’ai utilisé [^_]* sur chaque groupe sauf le dernier, dans chaque règle. Cela évite que le moteur d’expression rationnelle effectue un retour en arrière inutile dans le cas de non-concordance. Fondamentalement, avoir neuf écanvass universelles .* Dans une expression rationnelle entraîne une complexité de O (n 9 ) (ce qui est assez grave) dans le “pire des cas”, qui est une non-correspondance, ce qui serait le cas le plus fréquent. (Je peux recommander ce livre à ceux qui souhaitent vraiment comprendre comment une expression rationnelle est réellement exécutée par la bibliothèque sous-jacente.)

Pour cette raison, si vous pouvez limiter le nombre de tirets à moins de 15, je recommanderais de supprimer la première règle ou les deux premières. Les trois dernières règles traduiront à elles seules jusqu’à 7 traits de soulignement; les deux derniers traduiront jusqu’à 3.

Enfin, vous n’avez pas mentionné la redirection de l’utilisateur vers la nouvelle URL. (Plutôt que de simplement servir le contenu à la fois sur l’URL soulignée et sur celle correcte, ce qui est généralement mal vu par les moteurs de recherche. Juste pour info.) Si c’est ce dont vous avez besoin, vous devrez emplacement qui est déclenché par la présence d’un trait de soulignement dans l’URL, et qui redirige l’utilisateur vers la nouvelle URL à la fin des quatre réécritures:

 location ~ _ { rewrite ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5-$6-$7-$8-$9; rewrite ^([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*)$ $1-$2-$3-$4-$5; rewrite ^([^_]*)_([^_]*)_(.*)$ $1-$2-$3; rewrite ^([^_]*)_(.*)$ $1-$2; rewrite ^ $uri permanent; } 

Cela ajoute également l’avantage de transférer un nombre illimité de traits de soulignement dans une seule URL, au désortingment de ceux redirigés vers le navigateur de l’utilisateur.

HTH ;-P

Cela vient à échéance, mais je dois préciser que la réponse ci-dessus doit être corrigée car l’utilisation de n nombres différents de rewirtes où n est la quantité de soulignements présents dans l’URL est totalement inutile. Ce problème peut être résolu en utilisant 3 directives de localisation différentes et en réécrivant les règles en considérant les scénarios suivants dans leur expression régulière:

  1. Il y a un ou plusieurs traits de soulignement à la fin de l’URL.
  2. Il y a un ou plusieurs traits de soulignement au début de l’URL
  3. Il y a un ou plusieurs sous-ensembles au milieu de l’url

      location ~*^/(?\_+)(?[a-zA-Z0-9\-]*)$ { return 301 $scheme://$host/-$t2; } location ~*^/(?[a-zA-Z\_0-9\-]*)(?\_+)$ { return 301 $scheme://$host/$t2-; } location ~*^/(?[a-zA-Z0-9\-]*)(?\_+)(?[a-zA-Z0-9\-]*)$ { return 301 $scheme://$host/$t2-$t3; } 

Ces trois directives remplaceront récursivement tous les soulignés par «-» jusqu’à ce qu’il n’en rest plus

-BeWilled