如何用Nginxreplace下划线

我有史以来第一次使用Nginx,并且基本上不了解它。

我需要在“100+”url中将“_”replace为“ – ”。 我觉得必须有一个简单的方法来与Nginx做到这一点,但在Google上找不到任何东西。

谢谢!

编辑:

我的url是例如: http : //www.mywebsite.com/this_category/page1.php

我需要这个成为: http : //www.mywebsite.com/this-category/page1.php

不,这样做不是一个简单的方法,但是重写引擎可以被强制执行,假设你可以对一个URL中需要转换的破折号数量设置一个合理的上限(或者, t,看答案的结尾。)

以下是我怎么做(测试代码):

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

四个重写分别将url中的第一个8,4,2和1个下划线翻译成破折号。 每条规则中下划线的数目有意降低2次方。 这个块是最有效的一组规则,它将使用所有16​​个匹配或不匹配每个单独规则的组合,在单个URL中将0个下划线转换为15个下划线。

你也会注意到,在每一个规则中,除了最后一个,我都使用了[^_]* 。 这避免了在不匹配的情况下使正则表达式引擎执行不必要的回溯。 基本上,在正则表达式中有九个普遍的星.*在“最坏情况”中导致O(n 9 )复杂性(这是非常糟糕的),这是不匹配的,这实际上是最常见的情况。 (我可以为那些希望真正理解一个正则表达式是如何被底层库实际执行的人推荐这本书 。)

出于这个原因,如果你可以对破折号的数量设置一个比15更小的限制,我建议把第一个规则,或者前两个。 仅仅最后三条规则就会翻译成7个下划线; 最后两个将翻译到3。

最后,你没有提到将用户重定向到新的url。 (而不仅仅是在网址和正确的内容上提供内容,这通常是搜索引擎坚持不了的,只是供参考)如果这是你所需要的,你将不得不把这些重写放到一个特殊的在URL中出现下划线时触发的位置,并在四次重写结束时将用户重定向到新的URL:

 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; } 

这也增加了在单个URL中转换无限数量的下划线的好处,代价是将更多的重定向到用户的浏览器。

HTH; – P

这个时间已经过去了,但是我必须指定上面的答案需要改正,因为使用了n个不同数目的rewirtes,其中n是URL中下划线的数量是完全不需要的。 这个问题可以通过使用3个不同的位置指令和重写规则来解决,同时在常规表达式中引用以下场景:

  1. 在网址的END处有一个或多个下划线。
  2. 在URL的开始处有一个或多个下划线
  3. 在URL的MIDDLE中有一个或多个underocres

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

这三个指令将递归地用' – '代替所有的下划线,直到没有剩下的

-BeWilled