如何为JavaScript重写URL结构


How to rewrite URL structure for JavaScript

我有一个网页,基本上有以下URL结构:

www.example.com/main.php?userId=mattias.wolff
www.example.com/definitions.php?userId=mattias.wolff
www.example.com/tasks.php?userId=mattias.wolff
www.example.com/profile.php?userId=mattias.wolff

我想做的是改变这个以摆脱参数:

www.example.com/mattias.wolff
www.example.com/mattias.wolff/definitions
www.example.com/mattias.wolff/tasks
www.example.com/mattias.wolff/profile

服务器端这不是问题,因为我可以使用mod重写将URL重写为"旧"格式(包括参数等)

我的问题是客户端应该如何处理?页面内容在很大程度上是由JavaScript生成的,因此我需要以与以前相同的方式获取参数。

这里有我错过的一些最佳实践吗?在上写一个函数来解析Javascript中的新URL,或者用某种参数从服务器端发送"旧"URL?

不要忘记,URL本质上也是一个(有点)查询。这里的主要区别是使用的是命名参数还是位置的参数。

?表示法本质上是一种允许浏览器自动从表单查询中构造URL的标准。

你也可以使用该方案的URL:

www.example.com/name=mattias.wolff/page=definitions

如果这是你想要的。

我给你的建议是,真正为你的页面定义一个URL方案,完全符合你的需求,并有足够的空间进行未来的扩展。理想情况下,如果需要,您应该能够在某个时刻切换回旧方案,而不会出现主要名称冲突。

/[username]/[page]的方案中组织您的URL,并从JavaScript中使用此方案(用于解析和生成链接!)显然没有错,只要您不一直更改它。

使用以下简单的(?)函数,您可以按照指示的方式转换URL:

function transform (href) {
  var m = href.match (/((?:[^'/]+'/'/)?[^'/]+'/)(.*)'.php'?userId=(.*)/);
  return m ? m[1] + m[3] + '/' + m[2] : href;
}

基本上,该函数使用regexp匹配将URL的组件提取到一个数组中,然后按照您想要的方式重新组装URL。如果匹配失败,则返回原始URL。

使用在Chrome上进行测试

var test = ["www.example.com/main.php?userId=mattias.wolff",
            "www.example.com/definitions.php?userId=mattias.wolff",
            "http://www.example.com/tasks.php?userId=mattias.wolff",
            "www.example.com/profile.php?userId=mattias.wolff"];
for (var i = test.length; i--;)
  console.log ('"' + test[i] + '" --> "' + transform (test[i]) + '"');

输出:

"www.example.com/profile.php?userId=mattias.wolff" --> "www.example.com/mattias.wolff/profile"
"http://www.example.com/tasks.php?userId=mattias.wolff" --> "http://www.example.com/mattias.wolff/tasks"
"www.example.com/definitions.php?userId=mattias.wolff" --> "www.example.com/mattias.wolff/definitions"
"www.example.com/main.php?userId=mattias.wolff" --> "www.example.com/mattias.wolff/main"