用特殊字符重写 URL
Rewriting URL with special characters
我的网站上有一堆抓取错误,指向不存在(并且从未存在过)的页面。它是由一些为搜索页面生成 JSON-LD schema.org 的错误代码创建的。基本上,我有成千上万个看起来像这样的 404
http://www.domain.com/search/%7Bsearch_term%7D%2Fpage%2F2%2Fpage%2F3%2Fpage%2F6%2Fpage%2F2%2Fpage%2F3%2Fpage%2F6%2Fpage%2F6%2Fpage%2F2%2Fpage%2F2%2Fpage%2F3%2Fpage%2F2%2Fpage%2F6%2Fpage%2F3%2Fpage%2F2%2Fpage%2F6%2Fpage%2F3%2Fpage%2F2%2Fpage%2F7%2Fpage%2F2%2Fpage%2F2%2Fpage%2F8%2Fpage%2F3
http://www.domain.com/search/%7Bsearch_term%7D%2Fpage%2F2%2Fpage%2F6%2Fpage%2F2%2Fpage%2F3%2Fpage%2F6%2Fpage%2F2%2Fpage%2F6%2Fpage%2F6%2Fpage%2F6%2Fpage%2F2%2Fpage%2F3%2Fpage%2F3%2Fpage%2F3%2Fpage%2F2%2Fpage%2F2%2Fpage%2F3%2Fpage%2F7%2Fpage%2F2%2Fpage%2F7%2Fpage%2F2%2Fpage%2F8%2Fpage%2F3
我对正则表达式很糟糕,需要一些帮助来弄清楚如何解决这个问题。作为短期解决方案,我只想将 URL 中带有 /search/{search_term}/ 的 URL 请求重定向到 /search 页面。
关于我应该做什么的任何提示?这就是我一直在搞的事情,这显然是错误的。很抱歉,如果这是一个非常简单的问题,但我一直在尝试我在网上找到的不同的东西,但一直没有成功。
RewriteRule ^/search/%7Bsearch_term%7D$ /search [R,L=301]
RewriteRule ^/search/\{search_term\}$ /search [R,L=301]
你很接近。您可以使用此规则:
RewriteRule ^search/\{search_term\} /search [R,L=302,NC]
或者如果 search_term
也是动态字符串,则使用:
RewriteRule ^search/\{[^}]+\} /search [R,L=302,NC]
编辑: 您将需要在 Apache 或虚拟主机配置中使用此指令:
AllowEncodedSlashes On
否则 Apache 会拒绝带有这些特殊字符的请求,而不给您任何机会在 mod_rewrite
中处理它们。
就在我的脑海中,应该这样做:
RewriteRule ^search\/(.+) http://www.yourdomain.com/search [R=302]
上面语法的解释:
^
表示比赛开始
\
是转义字符,所以 \/
表示 转义正斜杠 (可能不必要,但无害)
()
是一个捕获组
.
表示任意字符
+
表示一个或多个
所以整个正则表达式的意思是:
从文件夹层次结构中的当前位置开始,匹配
搜索/
后跟一个或多个字符。
N.B. 重要的是 R
标志表示重定向的类型,所以你需要 R=302
, (不是L=302
,不存在)
我的网站上有一堆抓取错误,指向不存在(并且从未存在过)的页面。它是由一些为搜索页面生成 JSON-LD schema.org 的错误代码创建的。基本上,我有成千上万个看起来像这样的 404
http://www.domain.com/search/%7Bsearch_term%7D%2Fpage%2F2%2Fpage%2F3%2Fpage%2F6%2Fpage%2F2%2Fpage%2F3%2Fpage%2F6%2Fpage%2F6%2Fpage%2F2%2Fpage%2F2%2Fpage%2F3%2Fpage%2F2%2Fpage%2F6%2Fpage%2F3%2Fpage%2F2%2Fpage%2F6%2Fpage%2F3%2Fpage%2F2%2Fpage%2F7%2Fpage%2F2%2Fpage%2F2%2Fpage%2F8%2Fpage%2F3
http://www.domain.com/search/%7Bsearch_term%7D%2Fpage%2F2%2Fpage%2F6%2Fpage%2F2%2Fpage%2F3%2Fpage%2F6%2Fpage%2F2%2Fpage%2F6%2Fpage%2F6%2Fpage%2F6%2Fpage%2F2%2Fpage%2F3%2Fpage%2F3%2Fpage%2F3%2Fpage%2F2%2Fpage%2F2%2Fpage%2F3%2Fpage%2F7%2Fpage%2F2%2Fpage%2F7%2Fpage%2F2%2Fpage%2F8%2Fpage%2F3
我对正则表达式很糟糕,需要一些帮助来弄清楚如何解决这个问题。作为短期解决方案,我只想将 URL 中带有 /search/{search_term}/ 的 URL 请求重定向到 /search 页面。
关于我应该做什么的任何提示?这就是我一直在搞的事情,这显然是错误的。很抱歉,如果这是一个非常简单的问题,但我一直在尝试我在网上找到的不同的东西,但一直没有成功。
RewriteRule ^/search/%7Bsearch_term%7D$ /search [R,L=301]
RewriteRule ^/search/\{search_term\}$ /search [R,L=301]
你很接近。您可以使用此规则:
RewriteRule ^search/\{search_term\} /search [R,L=302,NC]
或者如果 search_term
也是动态字符串,则使用:
RewriteRule ^search/\{[^}]+\} /search [R,L=302,NC]
编辑: 您将需要在 Apache 或虚拟主机配置中使用此指令:
AllowEncodedSlashes On
否则 Apache 会拒绝带有这些特殊字符的请求,而不给您任何机会在 mod_rewrite
中处理它们。
就在我的脑海中,应该这样做:
RewriteRule ^search\/(.+) http://www.yourdomain.com/search [R=302]
上面语法的解释:
^
表示比赛开始
\
是转义字符,所以 \/
表示 转义正斜杠 (可能不必要,但无害)
()
是一个捕获组
.
表示任意字符
+
表示一个或多个
所以整个正则表达式的意思是:
从文件夹层次结构中的当前位置开始,匹配
搜索/
后跟一个或多个字符。
N.B. 重要的是 R
标志表示重定向的类型,所以你需要 R=302
, (不是L=302
,不存在)