如何用.htaccess重定向含括号URL,避免括号内容成为%变量
URL重定向:移除括号及内容的实现方案
针对将example.com/example/(justsometext)/id-123这类URL重定向到example.com/example/id-123的需求,核心是转义URL中的字面括号,避免正则引擎将其识别为捕获组(即不会把括号内内容当成%1/$1这类变量)。以下是主流服务器的具体实现:
Apache(mod_rewrite)
在.htaccess或服务器配置文件中添加规则:
RewriteEngine On # 匹配带括号内容的URL,重定向到移除括号部分的地址 RewriteRule ^example/\([^)]+\)/(id-\d+)$ /example/$1 [L,R=301]
规则说明:
\(和\):转义字面括号,告诉正则引擎这是需要匹配的普通字符,而非捕获组标记[^)]+:匹配括号内的任意内容(直到遇到右括号为止)(id-\d+):仅将末尾的id-xxx部分设为捕获组($1),用于重定向后的路径[L,R=301]:L表示这是最后一条规则,R=301表示永久重定向(需临时重定向可改为R=302)
Nginx
在Nginx配置文件的server块内添加规则:
location /example/ { rewrite ^/example/\([^)]+\)/(id-\d+)$ /example/$1 permanent; }
规则说明:
- 同样通过
\(和\)转义字面括号,避免被识别为捕获组 permanent对应301永久重定向,临时重定向可改为redirect- 仅捕获并保留末尾的
id-xxx部分,替换掉中间的括号及内容
如果需要匹配更通用的场景(比如id-xxx前的路径不固定),可以调整正则为:
# Apache通用版:匹配任意路径下的(xxx)部分并移除 RewriteRule ^(.*)/\([^)]+\)/(.*)$ /$1/$2 [L,R=301]
# Nginx通用版 rewrite ^/(.*)/\([^)]+\)/(.*)$ /$1/$2 permanent;
内容的提问来源于stack exchange,提问作者Roman Sadovnik
相关产品推荐
相关产品推荐

