重定向规则以从 URL 中删除查询字符串

Redirect rule to remove query string from URL

一直在尝试使用查询字符串编写重定向规则但没有成功。

我有 URL example.com/blog/?page=1example.com/blog/?hello,所以查询字符串中的内容并不重要。如何编写重定向规则,以便它剪切查询字符串并重定向到查询字符串之前的 URL 。例如,这两个 URL 都必须重定向到 example.com/blog/,以便 URL 不包含任何查询字符串。

我在努力 RewriteRule ^blog/?$ blog/ [R=301,L,NE] 但被重定向到 404 页面。

也试过了 RewriteRule ^blog/?$ /blog/ [R=301,L,NE] 并收到页面无法正常工作的消息,'URL' 重定向您的次数过多。

顺便说一句,我使用的技术是带有 htaccess 插件的 Gatsby。

要删除查询字符串,您首先需要检查是否有要删除的查询字符串,否则,它什么都不做。

例如,要从 /blog/?<query-string> 中删除查询字符串,您可以这样做:

RewriteCond %{QUERY_STRING} .
RewriteRule ^(blog)/?$ // [QSD,R=302,L]

这匹配 URL-path blog/(尾部斜杠可选)并重定向到 /blog/(尾部斜杠)。您的示例 URL 包含尾部斜线,但您的正则表达式似乎表明尾部斜线是可选的?

前面的条件RewriteCond指令)检查QUERY_STRING服务器变量以确保这是non-empty(即它匹配单个字符,用点表示)。

substitution 字符串中的 </code> 反向引用包含前面 <code>RewriteRule pattern[=76 中捕获组的值=]. IE。本例中的“博客”。这简单地节省了重复。你可以很容易地写 RewriteRule ^blog/?$ /blog/ [QSD,R,L] 来代替。

QSD(查询字符串丢弃)标志从重定向的响应中删除原始查询字符串,否则,这将默认通过(这将创建一个 redirect-loop)。

如果请求不包含查询字符串,则此规则不执行任何操作(因为 条件 将失败)。

如果这是永久性的,则将 302(临时)重定向更改为 301(永久性),但前提是您确认这按预期工作。 301 由浏览器持久缓存,因此会使测试出现问题。


查看您现有的规则:

was trying RewriteRule ^blog/?$ blog/ [R=301,L,NE] but got redirected to 404 page.

默认情况下,相对 替换 字符串(即 blog/)被视为相对于包含 .htaccess 文件和此“ directory-prefix" 然后作为前缀回到相对 URL,因此这将(默认情况下)导致格式错误的重定向 https://example.com/path/to/public_html/blog/.

Also tried RewriteRule ^blog/?$ /blog/ [R=301,L,NE] and got message that page is not working, 'url' redirected you too many times.

这不是在检查(或删除)查询字符串,因此这基本上只是重定向到自身 - 无休止的 redirect-loop。


any 中删除 any 查询字符串 URL

What rule do i write, to remove query string from any URL.

修改 RewriteRule 模式 以匹配任何 URL 并重定向到相同的。例如:

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

这需要在任何现有重写之前位于 root .htaccess 文件的顶部。

如果 .htaccess 文件在子目录(不是根目录)中,那么您将需要执行类似以下的操作,因为 </code> 反向引用(如上所用)不会包含完整的 root-relative URL-path.</p> <pre><code>RewriteCond %{QUERY_STRING} . RewriteRule ^ %{REQUEST_URI} [QSD,R=302,L]