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

任何人都可以看到我做错了什么?

+0

因此我找到了问题的一部分。 NGINX $参数不包含'?'。所以我不得不修改我最后的地图部分:map $ host $ uri?$ args $ redirect_uri {} –

+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不是其中之一。