我的 URL 结构如下:
xyz/asset.html
abc/test.html
xyz/abc/test.html
xyz/abc/qwerty/test2.html
我想重定向:
xyz/asset.html to xyz/asset
xyz/abc/test.html to xyz/abc/test
xyz/abc/qwerty/test2.html to xyz/abc/qwerty/test2
目前我在我的 ngnix 配置中有这个重定向规则,它适用于第一级目录重定向:
location ~ ^/(xyz|abc).html { return 301 /$1; }
这适用于第一级直接访问,但不适用于子目录。如何实现?谢谢帮助。
答案1
有多种方法可以解决这个问题。以下是其中一种方法...
第一步是捕获 URI 中需要重写的部分。然后,我们可以使用块location
或使用rewrite
条件进行重定向。
使用location
块与named capture
...
location ~ ^/(?<variable>[/a-zA-Z0-9]+)\.html$ { return 301 /$variable; }
或者
location ~ ^/([/a-zA-Z0-9]+)\.html$ { return 301 /$1; }
使用rewrite
...
rewrite ^/(?'custom_url'[/a-zA-Z0-9]+)\.html$ /$custom_url permanent;
Nginx 支持named captures
使用以下语法:
?<name> Perl 5.10 compatible syntax, supported since PCRE-7.0
?'name' Perl 5.10 compatible syntax, supported since PCRE-7.0
?P<name> Python compatible syntax, supported since PCRE-4.0
参考:https://nginx.org/en/docs/http/server_names.html(在标题下正则表达式名称)。