2013-04-09 115 views
1

我第一次使用Nginx,并且基本上没有它的知识。如何用Nginx替换下划线到破折号

我需要用100个URL中的“ - ”替换“_”。我觉得必须有一个简单的方法来与Nginx做到这一点,但在Google上找不到任何东西。

谢谢!

编辑:

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

我想这能成为:http://www.mywebsite.com/this-category/page1.php

+0

“我需要用” - “在100+ URL中替换”_“。你能详细说明一下吗? – leonbloy 2013-04-09 20:51:35

+0

@leonbloy:对不起,我真的不清楚。你可以看到编辑 – Ebpo 2013-04-09 20:57:17

+0

可能重复的[重写Nginx替换字符?](http://stackoverflow.com/questions/11586590/nginx-replace-characters-in-rewrite) – leonbloy 2013-04-09 20:59:55

回答

12

没有,有没有做到这一点的容易方式,但重写引擎尽管如此,假设你可以对单个URL中需要转换的破折号数量设置合理的上限(或者即使你没有,请参见答案的结尾)。

以下是我会做它(测试代码):

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 )复杂性(这是非常糟糕的)在“最差情况”下,这是不匹配的,这实际上是您最常见的情况。 (我可以推荐this book对于那些谁愿意真正了解一个正则表达式实际上是由底层库执行。)

出于这个原因,如果你可以把一个小的限制上破折号比15的号码,我会推荐拿走第一条规则,或前两条。仅最后三条规则就会转化为7个下划线;最后两个将翻译为3.

最后,你没有提到将用户重定向到新的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; 
} 

这也增加traslating下划线无限数量的好处在一个网址中,代价是将更多的重定向到用户的浏览器。

HTH ;-P

+1

这是我在这里得到的最佳答案。非常感谢您花时间解释!这正是我需要的:) – Ebpo 2013-04-11 13:07:38

2

这都逾期时间,但我必须说明的是,上述答案需要在那里ñ被修正为使用ň不同数量rewirtes的URL中下划线的数量是完全不需要的。

  1. 有在URL的末尾一个或多个下划线:这个问题可以使用3个不同的位置指示和重写规则,同时concidering下列情况下,在他们的正规表示法来解决。
  2. 有在URL的开始一个或多个下划线
  3. 有一个或多个undersocres在URL中间

     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

+0

这种方法将执行N个重定向到浏览器,以便用N个下划线重写一个URL。这不是一个好的解决方案,因为它会让用户等待更长时间,并可能导致浏览器的重定向限制(“太多重定向”错误) – Tobia 2018-02-08 09:47:08

相关问题