2010-11-08 6 views
6

J'utilise la classe javascript suivante pour tirer des variables sur une chaîne de requête:Javascript ne trouve pas ma chaîne de requête mod_rewrite!

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

Alors ceci fonctionne: http://example.com/signinup.html?opt=login

J'ai besoin http://www.example.com/login/ travailler de la même façon. En utilisant mod_rewrite:

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

permet à la page de charger, le javascript pour charger, le css à charger, mais ne peut pas trouver mes fonctions javascript la clé opt (à savoir, il est undefined). Comment puis-je obtenir opt à mon javascript?

Répondre

3

Javascript est côté client. Mod_rewrite est côté serveur.

Par conséquent, Javascript ne verra jamais l'URL réécrite. En ce qui concerne votre navigateur, l'URL que vous avez entré est l'adresse finie. La seule vraie solution est de changer votre Javascript afin qu'il regarde l'URL qu'il a plutôt que l'ancienne version (ou peut-être analyser les deux alternatives, puisque l'ancienne URL fonctionnera encore et que les gens peuvent encore avoir d'anciens signets).

L'autre solution possible serait d'aller à votre code côté serveur (PHP? Quoi?) Où vous pouvez voir l'URL réécrite, et d'insérer du code javascript là-bas que vous pouvez analyser sur le côté client. Ce n'est pas une solution idéale. Vous feriez mieux d'aller avec l'option 1 et de changer votre Javascript pour faire face aux URLs qu'il va réellement obtenir.

+0

Merci à tous! @ La réponse de Spudley est la réponse la plus claire, mais tout le monde m'a donné de bonnes réponses. Client/serveur logique (ooops). En outre, d'autres peuvent être intéressés par la réponse de @ Chris's [R]. – Kyle

2

Votre problème est que JavaScript s'exécute côté client, donc il ne verra jamais la partie ?opt=login à laquelle l'URL est convertie en interne sur le serveur. Outre la modification de votre expression régulière pour qu'elle corresponde au nouveau format d'URL, la solution de contournement la plus simple consiste à écrire une instruction JavaScript côté serveur qui introduit la valeur de la variable opt dans JavaScript.

1

S'il s'agit d'un cas particulier, placez-le dans un cas particulier. Si vous réécrivez généralement, changez votre expression régulière générale. La façon dont mod_rewrite fonctionne, le client ne sait jamais l'URL réécrite. Du client, c'est /login/ et /login/ seulement. Seul le serveur sait que c'est vraiment signinup.html?opt=login. Il n'y a donc aucun moyen que votre expression régulière ou location.href puisse le savoir.

1

Si vous n'utilisez pas l'indicateur [R] dans votre RewriteRule, le navigateur (et donc le javascript) ne connaîtra jamais la nouvelle URL. Si vous ne voulez pas rediriger les gens, vous allez devoir ajouter du code à votre page de connexion pour obtenir les paramètres en javascript dans la page.

1

Si vous utilisez PHP, PHP peut créer une variable JavaScript pour vous. Par exemple:

$params = "?"; 

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

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

Maintenant, vous JavaScript aurez accès à une variable urlParams qui ressemble à ceci

?opt=login& 

Ensuite, dans votre code Javascript, où vous vous attendiez à utiliser les paramètres d'URL, utilisez la urlParams à la place.

Questions connexes