如果感叹号在结尾处,Apache URL重写将失败

时间:2016-07-13 08:40:28

标签: .htaccess mod-rewrite

这是我的重写规则:

    RewriteRule ^([a-z-\s]+)/([A-Za-z-\s]+)/([0-9]+)/([A-Za-z-\s]+)/?$  index.php?lang=$1&page_name=$2&propertyID=$3    [NC,L]

网址的最后一个元素是房产交易的标题,例如"三房平坦-IN-A-美丽-位置&#34 ;.一切都按预期工作......除非标题末尾有感叹号。

此网址可以正常使用:

mysite/bg/let/1/Ne-izpuskajte-tazi-oferta

但是这会返回" 404 Not Found"错误页面:

mysite/bg/let/1/Ne-izpuskajte-tazi-oferta!

我还用问号测试了它,它运行正常:

mysite/bg/let/1/Ne-izpuskajte-tazi-oferta?

最后一种模式 - ([A-Za-z-\s]+) - 并不期望任何标点符号,但它在解析网址时没有任何作用。

我该怎么办?指示将添加/编辑属性的管理员不要在标题中使用任何感叹号?或者是否有一种编程方式来处理这个问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

([A-Za-z-\s]+)匹配[A-Za-z-\s] 1次或多次,其中[..]是A-Z,a-z,文字 - 字符或空格范围内的任何字符。你发现那里没有感叹号。由于该正则表达式不匹配,因此不会重写。简单的解决方法是将感叹号添加到正则表达式:([A-Za-z!-\s]+)

为什么mysite/bg/let/1/Ne-izpuskajte-tazi-oferta?有效?嗯...在网址中,?是一个保留字符。它标记查询字符串的开始位置。 RewriteRule始终与主机名和公共前缀(基于.htaccess位置或特定<directory>上下文)之后和查询字符串之前的部分匹配。对于该网址,它与bg/let/1/Ne-izpuskajte-tazi-oferta匹配。