正则表达式规则匹配apache mod重写的url中的%符号

时间:2011-11-08 18:24:55

标签: apache mod-rewrite

你好,我的重写规则有时会出错,因为我的网址中有%符号。

例如这个网址:

http://www.chillisource.co.uk/product/Grocery/Dr.%20Burnoriums%20Psycho%20Juice/1/B005MSE5KG/Psycho_Juice_70%_Ghost_Pepper

这是我的重写规则:

RewriteRule ^product/([a-zA-Z]+)/([\sa-zA-Z0-9\-\+\.]+)/([0-9]+)/([A-Z0-9]+)/([a-zA-Z0-9]+) /product?&cat=$1&q=$2&page=$3&prod=$4&prodName=$5

如果产品名称中有%,则如何修改第5条规则([a-zA-Z0-9] +)以使其失败?

提前致谢。

2 个答案:

答案 0 :(得分:1)

也许,它不是%20,而是空间。也就是说,在url编码后传递给写入的URL。如果没有,那么只需在该范围内添加百分号。 (如果是 - 空格)。

答案 1 :(得分:0)

----忘了这一部分,我误解了这个问题----

根据我从mod_rewrite文档(http://httpd.apache.org/docs/current/mod/mod_rewrite.html)获得的内容,您不必处理十六进制编码的字符(我假设来自以下声明:

  

THE_REQUEST       浏览器向服务器发送的完整HTTP请求行(例如,“GET /index.html HTTP / 1.1”)。这不包括浏览器发送的任何其他标头。 此值未被转义(解码),与下面的大多数其他变量不同。

事实上,使用mod_rewrite实际上是不可能的,因为你必须处理 EVERYWHERE ,例如,你总是可以写%41而不是'A'

---但以下情况仍然如此---

但是你的重写规则不起作用,至少不能用你发布的请求URL:正则表达式的最后一部分“([a-zA-Z0-9] +)”是 FAR 太严格了。在这种情况下,它失败的原因如下:

  • 缺少对百分号的处理,如“70%”
  • 您忘记包含下划线“_”

尝试至少添加这两个字符(“[a-zA-Z0-9%_] +”),它应该有用。