2009-10-16 7 views
2

J'ai rencontré un problème avec mod_rewrite lors de la soumission de formulaires à nos scripts perl de site. Si quelqu'un fait une requête GET sur une page avec une URL telle que http://www.example.com/us/florida/page-title, je réécris que l'utilisation de la règle de réécriture suivante qui fonctionne correctement:Comment puis-je accéder aux paramètres transmis dans l'URL lorsqu'un formulaire est POSTé sur mon script?

 
RewriteRule ^us/(.*)/(.*)$ /cgi-bin/script.pl?action=Display&state=$1&page=$2 [NC,L,QSA] 

Maintenant, si cette page a une forme à ce que je voudrais faites un post de formulaire sur le même URL et demandez à Mod Rewrite d'utiliser la même règle de réécriture pour appeler le même script et invoquer la même action. Cependant, ce qui se passe est que la règle de réécriture est déclenchée, le script correct est appelé et toutes les variables POST de formulaire sont affichées, cependant, les paramètres réécrits (action, page d'état & dans cet exemple) ne sont pas transmis au Script Perl. Je l'accès à ces variables en utilisant le même code Perl pour les requêtes GET et POST:

use CGI; 
$query = new CGI; 
$action = $query->param('action'); 
$state = $query->param('state'); 
$page = $query->param('page'); 

J'inclus le drapeau QSA car je pensais que cela pourrait résoudre le problème, mais il n'a pas fait. Si je fais un POST directement à l'URL du script, tout fonctionne correctement. J'apprécierais toute aide pour comprendre pourquoi cela ne fonctionne pas actuellement. Merci d'avance!

Répondre

6

Si vous effectuez une requête POST, vous devez utiliser $query->url_param('action') etc. pour obtenir les paramètres de la chaîne de requête. Vous n'avez pas besoin ou ne bénéficiez pas du modificateur QSA.

+0

$ query-> url_param() a fait l'affaire. Je vidais initialement le paramètre $ query pour essayer de voir s'il était transmis à CGI.pm mais je suppose que les paramètres de l'URL POST ne font pas partie de l'objet $ query. Intéressant mais au moins j'ai maintenant la solution. Merci pour la réponse rapide Sinan! –

+0

@Russell C. Je pense que vous devriez remercier @chaos. Maintenant, qui a baissé ma réponse? –

+0

Oups. Nouveau ici. Je voulais dire, merci @chaos! –

3

Changer votre script:

use CGI; 
use Data::Dumper; 

my $query = CGI->new; # even though I'd rather call the object $cgi 
print $query->header('text/plain'), Dumper($query); 

et jeter un oeil à ce qui est passé à votre script et mettre à jour votre question avec cette information.

+0

-1 qui prépare une réponse, il n'affiche pas l'entrée. La chaîne de requête d'entrée provient de la variable d'environnement QUERY_STRING. –

+1

@Kinopiko Regardez la sortie devant vous. Les paramètres qui seront dans cet objet '$ cgi' ne seront que les paramètres passés par la poste, pas via l'URL. Cela devrait déclencher quelque chose qui dit ... hmmmm ... peut-être que le problème n'est pas avec 'mod_rewrite'. * Comment accéder au paramètre passé dans l'URL lorsque le formulaire que je suis en train de traiter a été POSTé? * Permettez-moi de voir les documents CGI. Certes, plus indirecte que la réponse '@ chaos's, mais menant toujours l'OP dans la bonne direction. Maintenant, si vous ne comprenez pas ce qu'il y a dans l'objet '$ cgi', alors c'est une question complètement différente. –

+0

Désolé, mon erreur. Je n'ai pas remarqué la partie Dumper ($ query). –

Questions connexes