用特殊字符重写URL

时间:2015-01-28 21:01:36

标签: regex .htaccess

我的网站上有一堆抓取错误,指向不存在(并且从未存在过)的网页。它是从一些为代码生成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} /重定向到/ search页面。

关于我应该做什么的任何提示?这就是我一直在搞乱的事情,这显然是错误的。对不起,如果这是一个非常简单的问题,但我一直在尝试在网上找到的不同的东西,并且只是打败我的头而没有成功。

RewriteRule ^/search/%7Bsearch_term%7D$ /search [R,L=301]
RewriteRule ^/search/\{search_term\}$ /search [R,L=301]

2 个答案:

答案 0 :(得分:2)

你非常接近。您可以使用此规则:

RewriteRule ^search/\{search_term\} /search [R,L=302,NC]

或者如果search_term也是动态字符串,则使用:

RewriteRule ^search/\{[^}]+\} /search [R,L=302,NC]

编辑:您需要在Apache或vhost配置中使用此指令:

AllowEncodedSlashes On

否则Apache会拒绝使用这些特殊字符的请求,而不会让您有机会在mod_rewrite处理它们。

答案 1 :(得分:1)

在我的头顶,这应该做到:

RewriteRule ^search\/(.+) http://www.yourdomain.com/search [R=302]

上述语法说明:

^表示比赛的开始

\是转义字符,因此\/表示转义正斜杠(可能不必要,但不会造成伤害)

()是一个捕获组

.表示任何字符

+表示

中的一个或多个

所以整个正则表达式意味着:

从文件夹层次结构中的当前位置开始,匹配

<强> 搜索/

后跟一个或多个字符。

NB 重要的是,R标志表示重定向的类型,因此您需要R=302,而不是L=302,而不是{{1}}存在)