1

我需要一个 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

所以所有的下划线都应该用连字符代替,并且一次应该只有一个连字符。

简短版本:将 --- 替换为 - 并将 _ 替换为 - 但通过将 _ 替换为 - 这 -_- 将变为 --- 并且必须再次调用规则一。

是否有可能在一个规则中做到这一点?如果不是如何以任何其他方式做到这一点:)我完全不知道如何用 nginx 做到这一点

任何帮助表示赞赏:)

4

1 回答 1

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;
        }
    }
}
于 2013-02-20T00:01:56.530 回答