Nginx MAP重定向问题
所以我一直在使用NGINX Maps来处理重定向,它们运行良好。但是最近我发现了一个问题,我无法弄清楚我的生活正在发生什么。Nginx MAP重定向问题
我有三个地图部分通过默认设置相互馈送。
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
任何人都可以看到我做错了什么?
所以这个问题是我的错。我能够通过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不是其中之一。
因此我找到了问题的一部分。 NGINX $参数不包含'?'。所以我不得不修改我最后的地图部分:map $ host $ uri?$ args $ redirect_uri {} –
我也修复了另一个问题。 –