我想用 .htaccess 删除 URL 末尾带问号的字符串

I want to remove a string with a question mark at the end of my URL with .htaccess

我要删除字符串

?mobile=1

来自具有 .htaccess 的不同 URL。所以:

https://www.example.com/?mobile=1 应该变成 https://www.example.com/

https://www.example.com/something/?mobile=1 应该变成 https://www.example.com/something/

我尝试了以下方法

RewriteEngine On
RewriteRule ^(.+)?mobile=1 / [R=301,L,NC]

但这似乎不起作用。有什么想法吗?

RewriteRule ^(.+)?mobile=1 / [R=301,L,NC]

RewriteRule 模式 仅匹配 URL 路径,这明显排除了查询字符串。所以上面的 永远不会 匹配。 (除非 URL 路径中有 % 编码的 ?,例如 %3F

要匹配查询字符串,您需要一个额外的 条件RewriteCond 指令)并匹配 QUERY_STRING 服务器变量。

正则表达式 .+(1 个或多个)将不匹配文档根目录(即您的第一个示例:https://www.example.com/?mobile=1)。在这种情况下,您需要允许 empty URL 路径。例如。 .*(0 个或更多)。

例如,在根 .htaccess 文件的 top 附近尝试以下操作:

RewriteCond %{QUERY_STRING} =mobile=1
RewriteRule (.*) / [QSD,R=301,L]

这与查询字符串 mobile=1 完全匹配,区分大小写(如您的示例所示)。不能存在其他 URL 参数。 CondPattern 上的 = 前缀使其成为完全匹配字符串比较,而不是通常的正则表达式。

并重定向到相同的 URL-路径,由包含 URL- 的 substitution 字符串中的 </code> 反向引用表示来自 <code>RewriteRule 模式 .

中捕获组的路径

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

首先使用 302(临时)重定向进行测试,并且仅更改为 301(永久)- 如果这是意图 - 一旦您确认其按预期工作。 301 由浏览器持久缓存,因此会使测试出现问题。