nginx 正则表达式,如何匹配不以/ .xml .html .htm等结尾
构建正则表达式用在nginx上,匹配不以给定字符串结尾的字符。
例如,把如下这两种非 html 结尾的地址重定向到 html结尾
https://www.redis.com.cn/commands/append/
https://www.redis.com.cn/commands/append
重定向到
https://www.redis.com.cn/commands/append.html
经过分析我们知道第一种是要把url结尾的斜杠 / 去掉加上 .html ,第二种是把以非斜线 / 和 .html 结尾的url加上 .html 。
对于普通
[^] 是单个字符判断,并不是按顺序判断。我们需要使用否定反向环视: .*(?<!\.html|\//)$
(?<!pattern):反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”,但不能匹配“2000Windows”。
对于要匹配的字符串pattern匹配的不匹配,否则匹配。
对于上面的第二种情况,可以在nginx中配置:
1 2 3 |
location ~* .*(?<!\.html|/)$ { rewrite ^(.*)$ $1.html permanent; } |
对于第一种情况可以,使用普通的正则配
1 2 3 |
location ~* .*/$ { rewrite ^(.*)/$ $1.html permanent; } |
对于第二种情况,如果 location 是 server 中的最后一个,你需要注意使用 permanent 不能用 break,否则可能会出现403问题。
分类: nginx