使用.htaccess从多个URL中删除多个查询字符串

nzkunb0c  于 2023-02-09  发布在  其他
关注(0)|答案(1)|浏览(195)

bounty将在23小时后过期。回答此问题可获得+50的声誉奖励。muhammad usman正在寻找来自声誉良好来源的答案

我想删除查询字符串,包括参数和值从网址与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

我需要像这样的干净的网址没有查询字符串和参数。category-slugproduct-slug只是例子。我相信我需要5规则

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]

先谢了

ffvjumwh

ffvjumwh1#

是,查询字符串完全匹配
虽然你已经给出了URL路径的例子,但看起来你只需要根据URL的查询字符串部分进行匹配,而不是URL路径?除非相同的查询字符串可能出现在另一个URL路径上,而你想保留?
您只需要关注要删除的查询字符串,而不是要保留的查询字符串。
我相信我需要5条规则。
看起来你只需要一个规则,但是有很多 * conditions *(RewriteCond指令),每个查询字符串都有一个 * condition *(因为你说它们是"精确匹配")。

RewriteCond %{QUERY_STRING} ^option=.+$ [NC,OR]
RewriteCond %{QUERY_STRING} ^[^=]+$

尽管,令人困惑的是,您并没有试图在规则中进行"精确匹配",而是使用了一个通用模式(尽管您已经声明您"不理解Regex")。
如果你想要"精确匹配",那么你根本不需要使用正则表达式。你可以在 * CondPattern *(RewriteCond指令的第二个参数)上使用=前缀操作符,使其精确(字典)匹配。
例如,请尝试以下内容:

RewriteEngine On

RewriteCond %{QUERY_STRING} =orderby=price-desc&add_to_wishlist=342 [OR]
RewriteCond %{QUERY_STRING} =option=com_content&view=article&id=91&Itemid=2 [OR]
RewriteCond %{QUERY_STRING} =start=72 [OR]
RewriteCond %{QUERY_STRING} =add_to_wishlist=9486 [OR]
RewriteCond %{QUERY_STRING} =orderby=price-desc&add_to_wishlist=332 [OR]
RewriteCond %{QUERY_STRING} =orderby=price-desc&add_to_wishlist=5736 [OR]
RewriteCond %{QUERY_STRING} =orderby=popularity [OR]
RewriteCond %{QUERY_STRING} =add_to_wishlist=350 [OR]
RewriteCond %{QUERY_STRING} =orderby=price-desc [OR]
RewriteCond %{QUERY_STRING} =orderby=date [OR]
RewriteCond %{QUERY_STRING} =post_type=map [OR]
RewriteCond %{QUERY_STRING} =PageSpeed=noscript [OR]
RewriteCond %{QUERY_STRING} =orderby=menu_order [OR]
RewriteCond %{QUERY_STRING} =Itemid=wzshaxrogq [OR]
RewriteCond %{QUERY_STRING} =orderby=price&add_to_wishlist=12953 [OR]
RewriteCond %{QUERY_STRING} =PageSpeed=noscript [OR]
RewriteCond %{QUERY_STRING} =add_to_wishlist=15153 [OR]
RewriteCond %{QUERY_STRING} =op [OR]
RewriteCond %{QUERY_STRING} =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
RewriteRule ^ %{REQUEST_URI} [QSD,R=302,L]

上面的代码重定向到相同的URL路径,但如果原始查询字符串与前面的 * conditions * 中所述的任何一个匹配,则会将其剥离。
QSD标志(放弃查询字符串)将从请求中删除原始查询字符串。这是Apache 2.4上的首选方法。但是,如果您仍然使用Apache 2.2,则需要附加空查询字符串(就像您在现有规则中所做的那样)。例如:
RewriteRule ^ %{REQUEST_URI}? [R,L]
请注意,最后一个RewriteCond指令中没有OR标志。
注意:您在要删除的URL/查询字符串列表中两次包含了查询字符串add_to_wishlist=9486
首先使用302(临时)重定向进行测试,只有在确认它按预期工作后,才更改为301(永久)。301由浏览器永久缓存,因此可能会使测试出现问题。
确保在测试之前清除浏览器缓存。

使用正则表达式组合条件

使用regex,您可以组合几个条件。例如,以下4个条件可以组合为一个:

RewriteCond %{QUERY_STRING} =orderby=popularity [OR]
RewriteCond %{QUERY_STRING} =orderby=price-desc [OR]
RewriteCond %{QUERY_STRING} =orderby=date [OR]
RewriteCond %{QUERY_STRING} =orderby=menu_order [OR]

与相同(使用regex * alternate *):

RewriteCond %{QUERY_STRING} ^orderby=(popularity|price-desc|date|menu_order)$ [OR]
    • 更新日期:**

是否有可能删除一切(查询字符串和参数等)从所有的URL与*的东西,而不是硬编码每个查询字符串?
要从 * every * URL中删除 * every * 查询字符串(真的吗?),您可以执行以下操作(不,您不使用*):

RewriteCond %{QUERY_STRING} .
RewriteRule ^ %{REQUEST_URI} [QSD,R=302,L]

这将从任何URL中删除任何查询字符串。* CondPattern * 中的单个点(.)匹配单个字符以检查是否存在查询字符串。
但这显然也会删除您想要"保留"的查询字符串。
正则表达式字符*是一个量词,它重复前面的标记0次或更多次。(它不是"通配符模式"。)此处不需要它。您需要检查查询字符串是否为 * something *,而不是 * nothing *。
还有其他选项:

  • 颠倒一下逻辑,对你想"保留"的查询字符串做例外处理,并删除其余的,但这取决于哪个更大。
  • 不要"完全"匹配查询字符串,而是匹配URL参数名称,并使用 * any * 值。

相关问题