一直试图用查询字符串编写重定向规则,但没有成功。
我有URLexample.com/blog/?page=1
或example.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
文件在子目录(而不是根目录(中,则需要执行以下操作,因为$1
backreference(如上所述(不会包含完整的根相对URL路径。
RewriteCond %{QUERY_STRING} .
RewriteRule ^ %{REQUEST_URI} [QSD,R=302,L]