用特殊字符重写 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,不存在)