如何重写JavaScript的URL结构

时间:2012-01-08 11:25:52

标签: php javascript url-rewriting

我的网页基本上包含以下网址结构:

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?

2 个答案:

答案 0 :(得分:1)

不要忘记,基本上,网址也是一种(某种类型)查询。这里的主要区别在于您是使用命名的参数还是位置参数。

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

您也可以使用该计划的网址:

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

如果那就是你想要的。

我建议您真正为您的网页定义一个完全符合您需求的网址,并为将来的扩展留出足够的空间。理想情况下,如果需要,您应该能够在某个时刻切换回旧方案,而不会发生重大名称冲突。

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

答案 1 :(得分:0)

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

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

基本上,该函数使用正则表达式匹配将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"