删除?来自 URL 在 htaccess 重定向和重写之后

Removing ? from URL after htaccess redirect and rewrite

我创建了一个新站点,Google 索引了我更改过的 URL 之一,因此想在新的 URL 中添加 301。 URL 是 SEF URL,因此已被重写。

我已经成功地创建了一个从旧页面到新页面的 301,并在浏览器中正确地重写了 URL,但是我完成它的方式有一个尾随 ?在我的 URL.

结束时

首先,这有关系吗? Google 将其列为带和不带的同一页面吗?或者它将 URL 与 ?作为重复内容的单独页面?

如果它把它当作一个单独的页面,我该如何删除它?最后呢?

这是我在 htaccess 中的规则:

RewriteEngine on
Redirect 301 /search/toys/heroes-of-goo-jit-zu https://example.com/search/figures/heroes-of-goo-jit-zu?
RewriteBase /
RewriteCond %{HTTP_HOST} !^domain.com$ [NC]  
RewriteRule .? https://example.com%{REQUEST_URI} [R=301]
RewriteRule ^search/([a-zA-Z0-9.\-_]+)/([a-zA-Z0-9.\-_]+)/([a-zA-Z0-9.\-_]+) search.php?category=&subcategory=&subsubcategory= [QSA]
RewriteRule ^search/([a-zA-Z0-9.\-_]+)/([a-zA-Z0-9.\-_]+) search.php?category=&subcategory= [QSA]
RewriteRule ^search/([a-zA-Z0-9.\-_]+) search.php?category= [QSA]

没有?在规则的末尾,我得到了我不想要的 URL 末尾的所有查询字符串。最后我尝试了各种标志,[QSA] 和 [QSD] 都会导致 500 个错误,这是我能找到的唯一方法来进行重定向和重写而不会导致 500 个错误

mod_alias Redirect 指令将保留目标 URL 上的尾随 ?。您应该使用 mod_rewrite RewriteRule 指令而不是按照您的要求执行并删除查询字符串。并且由于您将 mod_rewrite 用于其他 redirects/rewrites,因此您应该避免混合来自两个模块的重定向以避免意外冲突。 (mod_rewrite 总是首先处理,尽管配置文件中指令的顺序很明显。)

改用mod_rewrite:

RewriteRule ^search/toys/heroes-of-goo-jit-zu$ https://example.com/search/figures/heroes-of-goo-jit-zu [QSD,R=301,L]

QSD(查询字符串丢弃)标志从重定向响应中删除原始查询字符串。

我在 RewriteRule 模式 中包含了 end-of-string 锚点 ($),尽管严格来说它应该被省略等同于您原来的 Redirect 指令(即 prefix-matching)。

您需要在测试前清除浏览器缓存,因为之前的 301 将被缓存。 (首先测试 302 - 临时 - 重定向以避免潜在的缓存问题。)

您还缺少所有其他规则中的 L 标记 - 应该添加。至少,这可以防止对以后的规则进行不必要的处理,但是在规范重定向中缺少 L 标志,这可能会导致错误的重定向,从而暴露重写的 URL.

更新: 澄清评论中关于 QSA 标志的讨论。这与您眼前的问题无关。如果您希望查询字符串在请求的 URLs 上过去,您将需要 QSA 标志(以便 合并 查询字符串在 substitution 字符串中),否则,应删除此标志。

I have tried various flags on the end, both [QSA] and [QSD] cause 500 errors

flags 参数仅适用于 mod_rewrite(RewriteRuleRewriteCond 指令)- 这对 [=56 无效=] Redirect(和RedirectMatch)指令。