2010-11-08 32 views
6

我用下面的JavaScript类拔变量了查询字符串:Javascript无法找到我的mod_rewrite查询字符串!

getUrlVars : function() { 
    var vars = {}; 
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { 
     vars[key] = value; 
    }); 
    return vars; 
} 

所以这个工程http://example.com/signinup.html?opt=login

我需要http://www.example.com/login/以相同的方式工作。使用mod_rewrite:

RewriteRule ^login/? signinup.html?opt=login [QSA]

使页面加载时,JavaScript加载,CSS的加载,但我的javascript功能无法找到opt键(即,它是undefined)。我如何获得opt我的JavaScript?

回答

3

JavaScript是客户端。 Mod_rewrite是服务器端的。

因此,Javascript永远不会看到重写的URL。就您的浏览器而言,您输入的URL是完成的地址。

唯一真正的解决方案是更改您的Javascript,以便查看它获取的URL而不是旧版本(或者可能解析两个备选方案,因为旧网址仍然有效,而且人们仍可能拥有旧书签)。

其他可能的解决方案是去你的服务器端代码(PHP?无论什么?),你可以看到重写的URL,并在那里插入一些你可以在客户端解析的JavaScript代码。虽然不是理想的解决方案。你会更好的选择1,并改变你的Javascript来应付它实际上会得到的URL。

+0

谢谢大家! @ Spudley的答案是最明确的答案,但每个人都给了我很好的答案。有意义的客户机/服务器(ooops)。另外,其他人可能对@ Chris的标志答案感兴趣。 – Kyle 2010-11-08 10:13:16

2

您的问题是,JavaScript运行在客户端,所以它永远不会看到URL在内部在服务器上转换到的部分?opt=login

除了更改正则表达式以匹配新的URL格式之外,最简单的解决方法可能是在服务器端编写JavaScript语句,该语句在JavaScript中引入opt变量的值。

1

如果是特殊情况,则以某种方式将其作为特例。如果你通常重写,改变你的一般正则表达式。 mod_rewrite的工作方式,客户端永远不知道重写的URL。从客户端,它只有/login//login/。只有服务器知道它真的是signinup.html?opt=login。所以你的正则表达式或者location.href是不可能知道的。

1

除非在RewriteRule中使用[R]标志,否则浏览器(以及JavaScript)永远不会知道新的URL。如果你不想重定向人,你将不得不添加一些代码到你的登录页面,在页面中将参数设置为javascript。

1

如果您使用PHP,您可以让PHP为您创建一个JavaScript变量。例如:

$params = "?"; 

foreach($_GET as $key => $value) { 
    $params = $params . $key . "=" . $value . "&"; 
} 

echo 'var urlParams = "' . $params . '"'; 

现在,你的JavaScript将有机会获得一个urlParams变量看起来像这样

?opt=login& 

然后,在你的JavaScript代码,无论你希望使用的URL参数,使用改为urlParams