2010-11-08 59 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