2013-04-09 103 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

相關問題