删除查询字符串和参数

问题描述

出于一些不值得深入研究的原因,Google 一直在为我的网站之一编制索引,网址中的查询字符串是 wordfence_lhhidwordfence_logHuman。我想修改我的 .htaccess 文件删除所有这些查询字符串。

我的网址

example.com/page/111/?wordfence_lh=1&hid=CA2BA660BEFF26B9A17F8F85D7391BD4

example.com/page/80/?wordfence_logHuman=1&hid=647700EBF43600E7BC54103256F1D71B

预期网址

example.com/page/111/

example.com/page/80/

我找到了删除单个参数的方法,但我仍然找不到正则表达式或其他东西来删除多个查询参数。 非常感谢任何帮助,非常感谢!

这是我的 .htaccess 文件的一部分:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} on [OR]
RewriteCond %{SERVER_PORT} ^555$ [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https
RewriteRule .* - [E=WPR_SSL:-https]
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteRule .* - [E=WPR_ENC:_gzip]
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{QUERY_STRING} =""
RewriteCond %{HTTP:Cookie} !(wordpress_logged_in_.+|wp-postpass_|wptouch_switch_toggle|comment_author_|comment_author_email_) [NC]
RewriteCond %{REQUEST_URI} !^(/(.+/)?Feed/?.+/?|/(?:.+/)?embed/|/(index\.PHP/)?wp\-json(/.*|$)|/cantonicalt/)$ [NC]
RewriteCond %{HTTP_USER_AGENT} !^(facebookexternalhit).* [NC]
RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}%{ENV:WPR_WEBP}.html%{ENV:WPR_ENC}" -f
RewriteRule .* "/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index%{ENV:WPR_SSL}%{ENV:WPR_WEBP}.html%{ENV:WPR_ENC}" [L]
</IfModule>

解决方法

这是简单的 SEO。您需要在 robots.txt 中阻止 GET 请求 只需将其添加到 robots.txt

Disallow: /?

并且所有 GET url 都被阻止以获取索引(不要索引)。 Google 从搜索中删除垃圾页面需要一些时间。

您可以阻止任何垃圾页面,只需添加

Disallow: *?s=
Disallow: *&s=
,

除了 3 个 URL 参数 wordfence_lh、hid 和 wordfence_logHuman 之外,我没有看到任何其他参数。我想删除它们

如果您在任何其他 URL 上没有任何其他 URL 参数,那么最简单的方法是在存在任何查询字符串的情况下删除整个查询字符串。例如:

# Remove any query string on all URLs
RewriteCond %{QUERY_STRING} .
RewriteRule ^ %{REQUEST_URI} [QSD,R=301,L]

这需要位于 .htaccess 文件的顶部,之前您现有的指令。

RewriteCond 指令检查是否存在任何查询字符串。 QSD 标志会丢弃重定向响应中的查询字符串。

但是,如果您在 other URL 上有其他 URL 参数,则需要保留这些参数,然后检查这些特定的 URL 参数(如第一次建议的那样),然后删除整个查询字符串(如果有的话)存在 URL 参数。例如:

# Remove the entire query string if any one of the URL params are present
RewriteCond %{QUERY_STRING} (&|^)(wordfence_lh|hid|wordfence_logHuman)=
RewriteRule ^ %{REQUEST_URI} [QSD,L]

但我仍然不想干扰谷歌分析等其他衡量工具。

除非您在其他 URL 上使用 URL 参数,并且这些参数有时与您要删除的 URL 参数混合在一起,否则这不是问题吗?


更新:

最近我刚刚测试了...与您的第二个代码相同吗?有什么区别?

RewriteCond %{QUERY_STRING} ^(.*)&?wordfence_lh=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L]

RewriteCond %{QUERY_STRING} ^(.*)&?wordfence_logHuman=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L]

RewriteCond %{QUERY_STRING} ^(.*)&?hid=[^&]+&?(.*)$ [NC]
RewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L]

不,这不是“相同的”。 “试图”保留与您要删除的 URL 参数混合的 URL 参数(如我在上面的最后一句话中提到的) - 这似乎不是您的要求。

但是,这些指令存在一些问题:

  1. 匹配太多,可能会损坏查询字符串。例如,它不仅匹配 hid=,它还匹配 foohid=,然后将保留可能“破坏”查询字符串的 foo 部分。例如。给定像 foohid=123&bar=1 这样的查询字符串,上述指令将重定向到 foobar=1,这显然是不正确的。

  2. 这一系列 3 条规则可能会触发 3 次外部重定向,因为每次出现要删除的 URL 参数时都会触发一次单独的重定向。这应该(并且可以)避免。在您的示例 URL(仅包含其中两个 URL 参数)中,您将获得两个重定向。两次重定向不一定太糟糕,但是,它可以减少为一次重定向(最坏的情况)。