这是我的重写规则:
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]+)
- 并不期望任何标点符号,但它在解析网址时没有任何作用。
我该怎么办?指示将添加/编辑属性的管理员不要在标题中使用任何感叹号?或者是否有一种编程方式来处理这个问题?
谢谢!
答案 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
匹配。