Nginx如何将带空格的两个URL路径重定向到单一目标地址
配置错误原因
- Nginx的rewrite规则匹配的是解码后的URI,URL编码的
%20会被解码为普通空格,你直接在正则里写%20无法匹配到对应路径 - 正则表达式中包含空格时,如果没有用双引号完整包裹正则,Nginx会把空格识别为参数分隔符,拆分你的正则表达式为多个参数,导致规则本身语法错误无法生效
- 你写的规则部分末尾加了
$严格匹配路径结尾,如果请求带查询参数或者额外路径后缀就会匹配失败 - 域名中的
.没有转义,会被正则识别为通配符匹配任意字符,规则匹配精度不够
正确配置方案
推荐用性能更高的return 301写法,放到对应server块内即可:
location ~* ^/xxxx/xxxx/\shttp://wikipedia\.com/xx { return 301 http://midomain.com/yyyy; }
如果更习惯用rewrite写法,可以用下面的规则:
rewrite "^/xxxx/xxxx/\shttp://wikipedia\.com/xx.*" http://midomain.com/yyyy permanent;
规则说明
\s用来匹配解码后的空白字符,对应原URL编码的%20- 正则中的
.做了转义处理,避免被识别为正则通配符 - 没有加末尾的
$,可以匹配该路径前缀下所有带后缀、带查询参数的请求 - 用
location匹配的执行效率高于rewrite规则,优先推荐使用
内容的提问来源于stack exchange,提问作者user1847844
相关产品推荐
相关产品推荐

