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



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

我有URLexample.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"重定向了你太多次。

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

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

例如,要从/blog/?<query-string>中删除查询字符串,您可以执行以下操作:

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

这与URL路径blog/(尾部斜线可选(匹配,并重定向到/blog/(带有尾部斜线(。您的示例URL包括尾部斜杠,但您的正则表达式似乎表明尾部斜杠是可选的?

前面的条件(RewriteCond指令(检查QUERY_STRING服务器变量,以确保它不是空的(即,它与一个由点表示的字符匹配(。

替换字符串中的$1反向引用包含前一个RewriteRule模式中捕获组的值。即";博客;在这个例子中。这样可以简单地避免重复。相反,您可以很容易地编写RewriteRule ^blog/?$ /blog/ [QSD,R,L]

QSD(查询字符串丢弃(标志从重定向的响应中删除原始查询字符串,否则,默认情况下会传递该字符串(这将创建重定向循环(。

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

如果这是永久性的,那么将302(临时(重定向更改为301(永久(,但只有在您确认这符合预期后。301被浏览器持久地缓存,因此可能使测试成为问题。


查看您的现有规则:

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

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

还尝试了RewriteRule ^blog/?$ /blog/ [R=301,L,NE],收到消息说页面不工作,"url"重定向了你太多次。

这不是检查(或删除(查询字符串,所以这基本上只是重定向到它自己——一个无休止的重定向循环。


任意URL中删除任何查询字符串

我写什么规则,从任何URL中删除查询字符串。

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

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

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

如果.htaccess文件在子目录(而不是根目录(中,则需要执行以下操作,因为$1backreference(如上所述(不会包含完整的根相对URL路径。

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

最新更新