如何用Nginx替换下划线

Ebp*_*bpo 1 nginx url-rewriting

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

我需要在100+ URL中将"_"替换为" - ".我认为必须有一个简单的方法来使用Nginx,但在Google上找不到任何东西.

谢谢!

编辑:

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

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

Tob*_*bia 14

不,没有一种简单的方法可以做到这一点,但重写引擎仍然可以强制执行,假设你可以在一个网址上转换需要转换的破折号数量(或者即使你不t,看到答案的结尾.)

这是我如何做到的(测试代码):

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

四个重写分别将url中的前8个,4个,2个和1个下划线转换为破折号.每条规则中的下划线数量有意降低2的幂.此块是最有效的规则集,它将在单个URL中从0到15次下划线转换,使用匹配或不匹配每个单独规则的所有16种组合.

您还会注意到我[^_]*在每个规则中使用的除了最后一个组之外的每个组.这避免了在不匹配的情况下使正则表达式引擎执行不需要的回溯.基本上,.*在正则表达式中有九个通用星会导致O(n 9)复杂度(这是非常糟糕的)在"最坏情况",这是一个非匹配,这实际上是你最常见的情况.(对于那些希望真正了解底层库实际执行regexp的人,我可以推荐这本书.)

因此,如果您可以对破折号的数量设置一个小于15的限制,我建议删除第一个规则或前两个规则.仅最后三条规则将最多转换为7个下划线; 最后两个将最多转换为3.

最后,您没有提到将用户重定向到新网址.(而不是仅仅在强调的网址和正确的网址上提供内容,这通常是搜索引擎坚果所不喜欢的.仅供参考.)如果这就是你所需要的,你将不得不将这些重写放入一个特殊的地方.在网址中存在下划线时触发的位置,并在四次重写结束时将用户重定向到新网址:

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;
}
Run Code Online (Sandbox Code Playgroud)

这还增加了在单个URL中翻译无限数量的下划线的好处,代价是更多的下划线重定向到用户的浏览器.

HTH ;-P