2013-02-14 46 views
1

我需要對以下問題的nginx重寫規則:nginx的重寫規則刪除 - 和_

我的網址包括一些連字符和最終強調

請求示例:http://www.example.com/cat/cat2/200-AB---a-12_12-123.312/cat-_-cat/cat/dog---I

會給404錯誤 所以需要一個301-重定向到:

http://www.example.com/cat/cat2/200-AB-a-12-12-123.312/cat-cat/cat/dog-I

所以所有的下劃線應該用連字符替換,並且一次只能有一個連字符。

簡短版本: 用---代替---並用_代替_ ,但用 - this -_-代替_將變成---而規則1將不得不再次被調用。

在一個規則中可以這樣做嗎?如果不是如何做到這一點任何其他方式:)我完全不知道該怎麼做nginx的

任何幫助讚賞:)

+1

我認爲這將是多,如果你做的更靈活它在應用程序端而不是nginx端。 – 2013-02-14 20:57:00

+0

您將需要遞歸重寫,nginx重寫是遞歸的,您需要找到在少於10個循環中執行的正確方法。 – regilero 2013-02-15 08:51:08

+0

形成我的理解重寫可以分兩步完成。首先用連字符替換下劃線,然後用一個替換多個連字符。但我絕對不知道該怎麼做。對不起,/ – user2025805 2013-02-15 09:46:08

回答

1
% nginx -c $PWD/test.conf 
% curl -I localhost:8080/cat/cat2/200-AB---a-12_12-123.312/cat-_-cat/cat/dog---I 
HTTP/1.1 301 Moved Permanently 
Server: nginx/1.3.13 
Date: Wed, 20 Feb 2013 00:09:50 GMT 
Content-Type: text/html 
Content-Length: 185 
Location: http://localhost:8080/cat/cat2/200-AB-a-1212-123.312/cat-cat/cat/dog-I 
Connection: keep-alive 

% cat test.conf 
events { } 

#error_log logs/error.log debug; 

http { 
    server { 
     listen 8080; 
     location /cat/cat2/ { 
      # replace up to 3 inconsecutive 
      # uderscores per internal redirect 
      rewrite "^(.+?)_+(?:(.+?)_+)?(?:(.+?)_+)?(.+)$" $1$2$3$4 last; 

      # replace up to 3 inconsecutive multiple 
      # hyphens per internal redirect 
      rewrite "^(.+?-)-+(?:(.+?-)-+)?(?:(.+?-)-+)?(.+)$" $1$2$3$4 last; 

      return 301 $uri; 
     } 
    } 
} 
+0

好吧,但是你有很長的網站嘗試了很長的網址嗎? nginx是否發生遞歸錯誤?沒有辦法讓這些正則表達式匹配無限數量的替換嗎? – regilero 2013-02-20 16:06:38

+0

因此,每次迭代3次替換後,此配置可以處理30個由任意數目的連字符或下劃線分隔的片段。要操作「無限數量的替代品」,您必須擁有無限的資源和無限的時間。 – VBart 2013-02-20 16:54:53