Redirect 要删除的nginx重写规则-和_

Redirect 要删除的nginx重写规则-和_,redirect,url-rewriting,nginx,rewrite,Redirect,Url Rewriting,Nginx,Rewrite,我需要一个nginx重写规则来解决以下问题: 我的URL包括几个连字符和下划线 请求示例: 将给出一个404错误 因此需要301-重定向到: 因此,所有下划线都应替换为连字符,并且一次只能有一个连字符 简短版本: 替换---为-并替换uu为- 但是,如果用-这个-取代-将成为-规则一必须再次被调用 可以用一条规则来解释吗?如果没有其他方法的话:)我完全不知道如何使用nginx实现这一点 感谢您的帮助:)我认为如果您在应用程序端而不是nginx端执行此操作,将会更加灵活。您将需要递归重写,ngi

我需要一个nginx重写规则来解决以下问题:

我的URL包括几个连字符和下划线

请求示例:

将给出一个404错误 因此需要301-重定向到:

因此,所有下划线都应替换为连字符,并且一次只能有一个连字符

简短版本: 替换---为-并替换uu为- 但是,如果用-这个-取代-将成为-规则一必须再次被调用

可以用一条规则来解释吗?如果没有其他方法的话:)我完全不知道如何使用nginx实现这一点


感谢您的帮助:)

我认为如果您在应用程序端而不是nginx端执行此操作,将会更加灵活。您将需要递归重写,nginx重写是递归的,您需要找到在不到10个循环中执行此操作的正确方法。据我所知,重写可以分两步完成。首先用连字符替换下划线,然后用一个连字符替换多个连字符。但我完全不知道该怎么做。对不起,/我认为如果你在应用程序端而不是nginx端进行重写,它会更加灵活。你需要递归重写,nginx重写是递归的,你需要找到正确的方法,在不到10个循环中完成。据我所知,重写可以分两步完成。首先用连字符替换下划线,然后用一个连字符替换多个连字符。但我完全不知道该怎么做。对不起,/好的,但是你有没有尝试过用一个很长的url和大量的宣传?nginx是否启动递归错误?难道没有办法让这些正则表达式匹配无限多个替换项吗?因此,每次迭代有3个替换项,这种配置可以处理由任意数量的连字符或下划线分隔的30个片段的URL。要操作“无限数量的替换”,您必须拥有无限的资源和无限的时间。好的,但是您是否尝试过使用包含大量宣传的非常长的url?nginx是否启动递归错误?难道没有办法让这些正则表达式匹配无限多个替换项吗?因此,每次迭代有3个替换项,这种配置可以处理由任意数量的连字符或下划线分隔的30个片段的URL。要操作“无限数量的替换”,您必须拥有无限的资源和无限的时间。
% 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;
        }
    }
}