所以我一直在使用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
谁能看到我做错了什么?
答案 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不是其中之一。