Linux

用於多級子目錄的 Ngnix 重定向

  • July 23, 2021

我有如下結構的 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; }

這適用於第一級直接但不適用於子目錄。如何做到這一點?謝謝您的幫助。

有多種方法可以解決這個問題。這是一種這樣的方式…

第一步是擷取需要重寫的 URI 部分。然後,我們可以使用location塊或使用rewrite條件進行重定向。

使用locationnamed 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 (在標題正則表達式名稱下)。

引用自:https://serverfault.com/questions/1070388