某次,为了提高网站文章的SEO搜索效率,决定将文章标题放入URL中,本来以为是一件傻瓜式操作的事情,不过还是遇到了一些问题:
- 标题作为复杂字符串,某些字符需要转义,我使用了如下方式:
title.replaceAll("/","_").replaceAll(" ","").replaceAll("%","");
第一个replaceAll,因为修改后的URL格式为:
@RequestMapping("/index/{id}/{title}")
如果title中有"/",会导致后台接收不到请求;
第二个replaceAll,将标题中所有空格删除;
第三个replaceAll,若URL中有"%",会让请求失效;
另外,为了兼容曾经的请求,对曾经的请求格式做了一次重定向:
@RequestMapping("/index")
public String index(Integer id){
// 创建title
return "redirect:/index"+id+"/"+title;
}
此时发现,若title中含有"[",又会导致请求失效(Model has no value for key '['
),于是加上了如下代码:
title.replaceAll("\\[","");
不过故事还没到头。为了再虐自己一次,把键盘上所有的字符都拼在一起,再加点汉字,组成了一个怪异标题:
String title="中国Refwin~`!@#$%^&*()_-+={[}]|\"':;<,>.?//*/.+- %%WRA President123";
果然,在访问页面时又打不开了,两个原因:
(1)重定向时中文会出现乱码,需要使用URLEncoder对其进行utf-8的编码;
(2)title中的""阻止了正常的重定向。
干脆,放弃一个个字符的替换,使用正则表达式(对除了字母数字下划线、汉字及一些可用字符之外的字符进行替换):
String title=title.replaceAll("[^\\w一-龥~`!@#$%^&*()\\-+={}\\[\\]|\"':;<,>.?*.+]", "");
return "redirect:/index"+id+"/"+URLEncoder.encode(title,"utf-8");
- 标题过长,可能影响请求效果;
- 在做牵涉范围较广,比如这种路由规则的修改时,需要提前调研好哪些请求会被影响到,并做好兼容措施。
版权声明:本文为m0_52613676原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。