1

我正在使用 Nginx njs 模块进行一些 url 修改。

我的用例是返回给定 uri 的重定向 uri。

URI 将如下所示:

/books
/books/economic-genious
/books/flight-mechanics

我的正则表达式匹配上述 URI 如下 -

/books/(.*)|/books$

表达式的第一部分/books/(.*) 是匹配以下 URI:

/books/economic-genious
/books/flight-mechanics

表达式的第二部分/books$ 是匹配以下 URI:

/books 

我的目的地配置如下/ebooks/$1:这样上面的 URI 将被转换为:

/ebooks
/ebooks/economic-genious
/ebooks/flight-mechanics

Javascript代码:

function getMappedURI(uri) {
    var exp = new RegExp('/books/(.*)|/books$');
    var destUri = '/ebooks/$1';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}

上面的代码适用于以下 URI:

/books/economic-genious
/books/flight-mechanics

但对于 URI /books,它应该返回/ebooks/。但它在 . 末尾附加了一些不可打印的特殊字符/ebooks/

我认为它正在尝试$1用一些特殊字符替换。

如何避免在最后添加特殊字符?

4

2 回答 2

1

OR|运算符仅适用于括号。所以你应该匹配到(/books/(.*)|/books$)并且我不认为这个$词匹配,因为对于任何要匹配的东西它也应该在括号中,使新的匹配 URL: (/books/(.*)|/books)。然后,您必须使用 $2 而不是 $1 作为替代品。

function getMappedURI(uri) {
    var exp = new RegExp('(/books/(.*)|/books)');
    var destUri = '/ebooks/$2';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}

但是,如果您想要从/books/footo的所有内容/ebooks/foo,请改用它:/books/(.*)使用 $1 作为替代。

function getMappedURI(uri) {
    var exp = new RegExp('/books/(.*)');
    var destUri = '/ebooks/$1';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}
于 2020-04-29T02:38:35.313 回答
1

试试这个正则表达式: \/books(\/(.*))?$

演示在这里...

代码:

function getMappedURI(uri) {
    var exp = new RegExp('\/books(\/(.*))?$');
    var destUri = '/ebooks$1';
    var redirectUri = uri.replace(exp, destUri);
    return redirectUri;
}
于 2020-04-29T03:59:41.300 回答