2013-02-14 47 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