如何在.htaccess中对特定URL设置通配符拦截与精准410重定向
关于.htaccess的两个URL规则问题解答
一、针对特定URL设置通配符拦截规则
通配符拦截本质是借助Apache的mod_rewrite模块,用正则表达式匹配符合模式的URL,再执行拦截动作(比如返回403、重定向等)。我给你举几个实用场景:
1. 拦截某前缀下的所有URL
比如要拦截所有以/old-blog/开头的请求,不管后面跟着什么内容,规则可以这么写:
RewriteEngine On RewriteRule ^old-blog/.*$ - [F,L]
^old-blog/.*$:正则里^匹配URL起始,old-blog/是固定前缀,.*是通配符(匹配任意字符),$匹配URL结尾,确保整个前缀后的内容都被覆盖[F,L]:F表示返回403 Forbidden(拦截访问),L表示这是最后执行的规则,避免后续规则干扰
2. 拦截包含特定字符串的URL
如果要拦截所有URL里带有malicious-tag的请求,规则可以简化成:
RewriteEngine On RewriteRule malicious-tag - [F,L]
这里不用加^和$,只要URL中出现这个字符串就会被匹配拦截。
注意点
- 先确认服务器开启了
mod_rewrite模块,不然所有规则都不会生效 - 规则顺序很关键:范围大的匹配规则要放在后面,防止提前匹配导致其他规则失效
二、精确对https://example.com/shop/设置410重定向,不影响子路径
核心是精准匹配根路径的/shop/,绝对不能让规则覆盖到/shop/anything-else这类子路径。直接用精确正则就能实现:
RewriteEngine On RewriteRule ^shop/$ - [R=410,L]
^shop/$:^确保从URL开头匹配,shop/是精确路径,$限制到这里结束,这样就只会命中https://example.com/shop/[R=410,L]:R=410表示返回410 Gone状态码(告知浏览器资源已永久移除),L表示停止执行后续规则
为什么不能写^shop/?
如果去掉末尾的$,^shop/会匹配所有以shop/开头的URL,包括/shop/anything-else,这就违背了你不想影响子路径的需求,所以$是关键。
额外补充
如果用户可能访问不带末尾斜杠的https://example.com/shop,可以先统一URL格式再返回410:
RewriteEngine On # 先把不带斜杠的shop重定向到带斜杠的版本 RewriteRule ^shop$ /shop/ [R=301,L] # 再对精确路径返回410 RewriteRule ^shop/$ - [R=410,L]
这样不管用户访问哪种格式的shop根路径,都会返回410,而子路径依然正常访问。
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

