如何用.htaccess移除多个URL中的多余查询字符串?
.htaccess 规则实现移除指定查询字符串并保留特定场景
需求说明
- 需要移除URL中所有非保留场景的查询字符串(包括参数和值)
- 需要处理的URL示例:
https://example.com/other-category-slug/page/15/?orderby=price-desc&add_to_wishlist=342 https://example.com/page/62/?option=com_content&view=article&id=91&Itemid=2 https://example.com/page/30/?start=72 https://example.com/other-category-slug/page/12/?add_to_wishlist=9486 https://example.com/other-category-slug/page/15/?add_to_wishlist=9486 https://example.com/other-category-slug/page/4/?orderby=price-desc&add_to_wishlist=332 https://example.com/other-category-slug/page/15/?orderby=price-desc&add_to_wishlist=5736 https://example.com/other- category-slug/page/7/?orderby=popularity https://example.com/other-category-slug/page/15/?add_to_wishlist=350 https://example.com/category-slug/page/19/?orderby=price-desc https://example.com/category-slug/page/3/?orderby=date https://example.com/page/2/?post_type=map https://example.com/category-slug/page/2/?PageSpeed=noscript https://example.com/category/page/6/?orderby=menu_order https://example.com/page/50/?Itemid=wzshaxrogq https://example.com/category-slug/page/1/?orderby=price&add_to_wishlist=12953 https://example.com/category-slug/this-is-product-slug/?PageSpeed=noscript https://example.com/category-slug/?add_to_wishlist=15153 https://example.com/page/24/?op https://example.com/page/68/?iact=hc&vpx=262&vpy=212&dur=2871&hovh=259&hovw=194&tx=104&ty=131&ei=KJ05TtKZOoi8rAfM2ZmPBQ&page=1&tbnh=129&tbnw=97&start=0&ndsp=35&ved=1t%3A429%2Cr%3A9%2Cs%3A0&doing_wp_cron=1466467271.7778379917144775390625
- 期望得到的干净URL格式:
https://example.com/category-slug/product-slug/ https://example.com/category-slug/page/15/ https://example.com/category-slug/ https://example.com/page/62/ https://example.com/
- 需要保留查询字符串的场景:
https://example.com/?attachment_id=123 https://example.com/?p=123 https://example.com/page/12/?fbclid=PAAaaK8eCN https://example.com/your-shopping-cart/?remove_item=22c1acb3539e1aeba2 https://example.com/category-slug/this-is-product-slug/?add-to-cart=29030 https://example.com/?s=%7Bsearch_term_string%7D
- 用户尝试过但无效的代码:
RewriteEngine On RewriteRule ^(page/[0-9]+)/.+$ /$1? [L,NC,R=301] RewriteCond %{QUERY_STRING} ^option=.+$ [NC,OR] RewriteCond %{QUERY_STRING} ^[^=]+$ RewriteRule ^$ /? [L,NC,R=301]
解决方案
以下是符合需求的.htaccess规则,逻辑为先排除需要保留的查询字符串,再重写移除其他所有查询字符串:
RewriteEngine On # 1. 排除需要保留的查询字符串场景,匹配到则终止后续规则 RewriteCond %{QUERY_STRING} ^attachment_id=.+$ [NC,OR] RewriteCond %{QUERY_STRING} ^p=.+$ [NC,OR] RewriteCond %{QUERY_STRING} ^fbclid=.+$ [NC,OR] RewriteCond %{QUERY_STRING} ^remove_item=.+$ [NC,OR] RewriteCond %{QUERY_STRING} ^add-to-cart=.+$ [NC,OR] RewriteCond %{QUERY_STRING} ^s=.+$ [NC] RewriteRule ^ - [L] # 2. 移除所有其他查询字符串,重定向到干净URL RewriteCond %{QUERY_STRING} .+ RewriteRule ^(.*)/?$ /$1? [R=301,L,NC]
规则说明
- 第一部分通过
RewriteCond逐个匹配需要保留的参数,只要匹配到任意一个,就用RewriteRule ^ - [L]停止后续规则,不对该URL做任何修改。 - 第二部分先检查是否存在查询字符串(
%{QUERY_STRING} .+),如果存在则将当前URL路径重定向到不带查询字符串的版本,末尾的?会自动清空查询参数。 R=301是永久重定向,适合SEO优化;测试阶段可以改成R=302临时重定向,确认生效后再改回301。NC标记表示匹配不区分大小写,避免因参数大小写差异导致规则失效。
内容的提问来源于stack exchange,提问作者muhammad usman
相关产品推荐
相关产品推荐

