Javascript找不到我的mod_rewrite查询字符串!

时间:2010-11-08 09:50:17

标签: javascript regex apache mod-rewrite

我使用以下javascript类从查询字符串中提取变量:

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?

5 个答案:

答案 0 :(得分:3)

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

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

唯一真正的解决方案是更改您的Javascript,以便它查看它所获得的URL而不是旧版本(或者可能解析两个备选方案,因为旧的URL仍然可以工作,人们可能仍然有旧的书签)。 / p>

另一种可能的解决方案是转到服务器端代码(PHP?无论如何?),在那里你可以看到重写的URL,并在那里插入一些你可以在客户端解析的javascript代码。虽然不是理想的解决方案。你最好选择1并改变你的Javascript以应对它实际上将要获得的URL。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

$params = "?";

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

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

现在,您可以使用JavaScript访问类似于此

的urlParams变量
?opt=login&

然后,在您的Javascript代码中,无论您希望在何处使用网址参数,请改用urlParams

答案 3 :(得分:1)

如果是特殊情况,请以某种方式将其作为特例。如果您通常重写,请更改常规正则表达式。 mod_rewrite的工作方式,客户端永远不会知道重写的URL。从客户端来看,它只是/login//login/。只有服务器才知道它真的是signinup.html?opt=login。所以你的正则表达式或location.href无法知道它。

答案 4 :(得分:1)

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