2010-09-06 13 views
6

Il mio problema è il seguente. Dopo che la password viene riconosciuta valida ho bisogno di reindirizzare a main.cgi ma sto ottenendo il messaggio come:Come posso reindirizzare il client da una pagina CGI a un'altra utilizzando Perl?

Status: 302 Found 
Location: http://localhost/cgi-bin/Main.cgi 

So che la ragione di questo è che sto scrivendo questa dichiarazione dopo Content-Type quindi sta prendendo questo come HTML e stampandolo sullo schermo. Sono un principiante di Perl. Qualcuno può aiutarmi a trovare la soluzione per questo e far funzionare il mio codice nel modo in cui lo voglio? O per favore suggeriscimi qualche codice alternativo per questo, o qualsiasi link che potrebbe aiutarmi.

#!C:\perl\bin\perl.exe 
use strict; 
use CGI qw(:standard); 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 
use DBI; 
my $q = new CGI; 

print "Content-Type: text/html\n\n"; 

if ($q->param("Login")) { 
    my $Password = param('Password'); 
    if (!$Password) { 
     print "Please Enter the Password"; 
    } else { 
     my $dbh = DBI->connect(
      "dbi:SQLite:DEVICE.db", 
      "", "", 
      { 
       RaiseError => 1, 
       AutoCommit => 1 
      } 
     ); 
     my $sth = $dbh->prepare("select * from Settings where Password = ?"); 
     $sth->execute($Password); 
     if (my $pass = $sth->fetchrow_hashref) { 
      print redirect(-url => 'http://localhost/cgi-bin/Main.cgi'); 
     } else { 
      print "Invalid Password"; 
     } 
     $dbh->disconnect; 
    } 
} 

print <<END1; 
<HTML> 
    <HEAD> 
     <TITLE> </TITLE> 
    </HEAD> 
    <body> 
     <form NAME="login" METHOD="POST"> 
      <input type="hidden" name="submit" value="Submit"> 
      <TABLE align="center" bgcolor=#B0C4DE> 
       <TR> 
        <TD> Enter The Password And Click Login</TD> 
       </TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR> 
        <TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD> 
       </TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR> 
       <TR> 
        <TD align="center" colspan="2"> 
         <input type="submit" name="Login" value="Login"> 
         <input type="reset" name="submit" value="Cancel"> 
        </TD> 
       </TR> 
      </TABLE> 
     </FORM> 
    </BODY> 
</HTML> 
END1 
+2

Non ho davvero guardato a questo, come hai detto, sei nuovo e questo ha molti problemi ben formati, ma stampi il tipo di contenuto più tardi, se sai che è il caso. – vol7ron

+0

HEY RINGRAZIAMO MOLTO ... l'ho messo jst sopra la stampa << END1 ... funziona perfettamente navigando verso la pagina desiderata..bt se inserisco la password sbagliata, invece di visualizzare la "password non valida" .. la pagina si sta rinfrescando ...ho provato a scrivere la frase "password non valida", bt dando un ERRORE: ERRORE SERVER INTERNO ,,,,,, quando ho controllato i log degli errori, poi ho scoperto che ... "header malformato da script. Bad header = : Login.cgi ", .. QUESTO È UN NUOVO NUMERO ORA ... per favore aiutami a risolverlo, se viene risolto allora ogni problema nel mio programma è risolto ... – sonya

+1

possibile duplicato di [Reindirizzamento da una pagina CGI a un'altra] (http://stackoverflow.com/questions/3649762/redirecting-from-one-cgi-page-to-another) – daxim

risposta

21

Il reindirizzamento:

print redirect(-url=>'http://localhost/cgi-bin/Main.cgi'); 

funziona solo quando è la prima cosa rimandato al browser. Perché stai inviando prima questo:

print "Content-Type: text/html\n\n"; 

il reindirizzamento viene considerato come contenuto.

(Il reindirizzamento deve essere la prima cosa che si invia perché appartiene alle intestazioni HTTP della risposta.Stampando il proprio \n\n, si stanno terminando esplicitamente quelle intestazioni.Dopo questo, tutto ciò che si invia è contenuto e sarà visualizzato dal browser.)

2

Vedere quanto segue, si spera che ti dia una buona idea su come mantenere il flusso di controllo "a destra" e ti aiuterà a identificare esattamente quali pezzi fanno cosa e dovrebbero fare cosa, nel tuo modulo:

#!/usr/bin/env perl 
# Windows does not use #! to launch stuff! 
use strict; 
use warnings; # always! 
use CGI qw(:standard); 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 
use DBI; 

my $q = CGI->new; 

my_program: 
{ 
    if (!$q->param('Login') or !length $q->param('Login')) { 
     print $q->header('text/html'), my_form(); # just display the form 
     last my_program; 
    } 

    my $password = $q->param('Password'); 
    if (!$password or !length $password) { 
     print $q->header('text/plain'), "Please enter the Password"; 
     last my_program; 
    } 

    my $dbh = DBI->connect(
     "dbi:SQLite:DEVICE.db", 
     "", "", 
     { 
      RaiseError => 1, 
      AutoCommit => 1 
     } 
    ); 
    my $sth = $dbh->prepare("select * from Settings where Password = ?"); 
    $sth->execute($password); 
    if (my $pass = $sth->fetchrow_hashref) { 
     print redirect(-url => 'http://localhost/cgi-bin/Main.cgi'); 
     last my_program; 
    } 
    print $q->header('text/plain'), "Invalid Password"; 
} 

sub print_my_form { 
return <<END1; 
<HTML> 
    <HEAD> 
     <TITLE> </TITLE> 
    </HEAD> 
    <body> 
     <form NAME="login" METHOD="POST"> 
      <input type="hidden" name="submit" value="Submit"> 
      <TABLE align="center" bgcolor=#B0C4DE> 
       <TR> 
        <TD> Enter The Password And Click Login</TD> 
       </TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR> 
        <TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD> 
       </TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR> 
       <TR> 
        <TD align="center" colspan="2"> 
         <input type="submit" name="Login" value="Login"> 
         <input type="reset" name="submit" value="Cancel"> 
        </TD> 
       </TR> 
      </TABLE> 
     </FORM> 
    </BODY> 
</HTML> 
END1 
} 

Non importa se non si utilizza il parametro "Login" ... il precedente perfor ms il reindirizzamento come lo vuoi, visualizza gli errori senza forma (usa un print my_form() dopo la riga dell'intestazione se è necessario) e sembra generalmente un po 'più ordinato.

+0

Hey, grazie mille Mr.mfontani..i ha incollato questo codice ... ogni volta che do una password valida, allora viene reindirizzato a Main.cgi..Ma quando do una password sbagliata, appare una finestra di dialogo che chiede "Vuoi salvare o aprire il file Login.cgi" .. e quando faccio clic su Apri quindi la sua DIsplaying MEsSage "password non valida" in PERL EXPRESS ... in realtà sto usando PERL EXPRESS per eseguire il mio perl progr ams .. – sonya

+0

Hai bisogno di usare $ q-> header ('text/plain') sopra nelle occasioni in cui stai dando solo gli errori, e $ q-> header ('text/html') quando presenta il modulo; aggiornato – mfontani

-4

Il modo più semplice è utilizzare il tag di aggiornamento META, non è necessario nemmeno regolare l'intestazione.

di questo codice:

#!C:\perl\bin\perl.exe 
use strict; 
use CGI qw(:standard); 
use CGI::Carp qw(warningsToBrowser fatalsToBrowser); 
use DBI; 
my $q = new CGI; 

my $redirect = 0; 

print "Content-Type: text/html\n\n"; 

if ($q->param("Login")) { 
    my $Password = param('Password'); 
    if (!$Password) { 
     print "Please Enter the Password"; 
    } else { 
     my $dbh = DBI->connect(
      "dbi:SQLite:DEVICE.db", 
      "", "", 
      { 
       RaiseError => 1, 
       AutoCommit => 1 
      } 
     ); 
     my $sth = $dbh->prepare("select * from Settings where Password = ?"); 
     $sth->execute($Password); 
     if (my $pass = $sth->fetchrow_hashref) { 
      $redirect = 1; 
     } else { 
      print "Invalid Password"; 
     } 
     $dbh->disconnect; 
    } 
} 

print <<END1; 
<HTML> 
    <HEAD> 
END1 

if ($redirect){ 
    print '<meta http-equiv="refresh" content="1;url=http://localhost/cgi-bin/Main.cgi/">'; 
} 

print <<END2; 
     <TITLE> </TITLE> 
    </HEAD> 
    <body> 
     <form NAME="login" METHOD="POST"> 
      <input type="hidden" name="submit" value="Submit"> 
      <TABLE align="center" bgcolor=#B0C4DE> 
       <TR> 
        <TD> Enter The Password And Click Login</TD> 
       </TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR> 
        <TD><b>PASSWORD</b> :<input type="password" name="Password" size="20" maxlength="15" /></TD> 
       </TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR></TR> 
       <TR> 
       <TR> 
        <TD align="center" colspan="2"> 
         <input type="submit" name="Login" value="Login"> 
         <input type="reset" name="submit" value="Cancel"> 
        </TD> 
       </TR> 
      </TABLE> 
     </FORM> 
    </BODY> 
</HTML> 
END2 
+0

Un Milione di ringraziamenti Mr.Darren..it funziona esattamente come volevo che funzionasse ... dopo una password valida mostra di nuovo il modulo per un po 'e poi lo reindirizza a main.cgi ... MA APPARTAMENTO DA QUELLO EVRY BIT FUNZIONA CORRETTAMENTE .... molto molto ... – sonya

+6

Meta Refresh è quello che usi quando non puoi farlo correttamente, come nella risposta più votata in questa domanda. –

+0

Grazie Brian, ma era abbastanza ovvio che Sonya stesse cercando una soluzione semplice con il minimo riscrittura possibile. –

4

si potrebbe desiderare di provare

print "<META HTTP-EQUIV=refresh CONTENT=\"1;URL=http://localhost/cgi-bin/Main.cgi\">\n"; 

il trucco è CONTENT=\"1 ritarderà pagina redirect per circa un secondo

Ho avuto lo stesso problema in modo tale il trucco ha funzionato per me piuttosto bene. Il codice non è bello ma funziona.

0

Per reindirizzare una pagina a un'altra, utilizzare il seguente metodo.

use CGI::Session; 
use CGI::Session::Plugin::Redirect; 
my $session = new CGI::Session(); 
print $session->redirect('http://example.com/redirect-path/redirect-file.php'); 

Cerca www.search.cpan.org per ulteriori dettagli sul modulo di sessione.

Problemi correlati