Nginx MAP重定向问题

时间:2017-10-17 14:42:16

标签: regex redirect nginx

所以我一直在使用NGINX Maps处理重定向,但它们运行良好。但最近我发现了一个问题,我无法弄清楚我的生活是怎么回事。

我设置了三个地图部分,通过默认设置相互提供。

map $host$uri $path_redirects {
    ~*^example.com\/(sample-url-path-)(a|b|c|d)+(\d+|\%.*)$   /$1$2;                                                                       
}

map $host$uri $page_redirects {
    default $path_redirects;
}

map $host$uri$args $redirect_uri {
    default $page_redirects;
    ~*^example.com\/(.*).html(\?PageSpeed.*)$     /$1.html;                                   
}

然后我实际上基于$ redirect_uri重定向。有点令人困惑,但它有助于我保持我的重定向有组织。

它一直很好,但现在我有一个问题,我怀疑与地图无关,但我无法弄清楚是什么。

插入regex101.com我可以使这些规则匹配:

https://regex101.com/r/kgFE7k/1

https://regex101.com/r/JLlcZi/2

但是当我在他的映射中使用它们时,它们根本不会重定向。我得到了404。

(重定向)example.com/sample-url-path-c2
(不重定向)example.com/sample-url-path-c%23.WYzyrdPyvVo
(不重定向)example.com/sample-url-page.html?PageSpeed=noscript

谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:2)

所以这个问题是我的错。我能够通过两件事来发现它。

我意识到%23实际上是URL编码而且是'#'而不是路径的一部分。这就是为什么我没有得到%23的匹配,但regex101有效,因为它将其视为纯文本。

其次,NGINX变量$ args不包括?来自URL字符串。那么,匹配的'?'在正则表达式中没有匹配它。

为了解决这个问题,我将两个规则都移到了我的$ args地图部分,它的内容为:

map $host$uri?$args $redirect_uri {
    default $page_redirects;
    ~*^example.com\/(.*).html(\?PageSpeed.*)$     /$1.html;
    ~*^example.com\/(sample-url-path-)(a|b|c|d)+(\d+|\#.*|\%.*)$   /$1$2;                                    
}

为了帮助其他人进行调试,有助于在响应中添加调试标头。在NGINX配置中,添加:

#DEBUG HEADERS
add_header X-host           "$host" always;
add_header X-uri            "$uri" always;
add_header X-args           "$args" always;
add_header X-full-url       "$host$uri$args" always;
add_header X-redirect-path  "$path_redirects" always;
add_header X-redirect-page  "$page_redirects" always;
add_header X-redirect-uri   "$redirect_uri" always;

更改变量以适应。始终如一的部分使NGINX始终提供服务,没有,它只提供一些HTTP响应代码,但404不是其中之一。