• Publicidad

Usar SSI desde un CGI

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Usar SSI desde un CGI

Notapor deer » 2006-01-03 11:08 @506

Hola, ¿qué tal, amigos?

Bueno, les cuento. ¿Cómo puedo usar SSI desde un CGI? Me explico.

Tengo una web en CGI en Perl, la cual recoge datos (index.cgi?web=home.html).

Entonces, mi cgi imprime una página html (que está grabado en el CGI) y dentro de esta página quiero anexar otra (y la quiero llamar desde SSI) y además en esta misma quiero llamar a otro CGI.

Lo puedo hacer desde un .shtml, pero no es la idea ya que tendría que crear un shtml para cada página.

Mi web está compuesta por tres tablas; la del centro es la que cambia, las de las esquinas son estáticas.

Entonces, la idea es para entrar a la página HOME entro a index.cgi?web=home.htm; para entrar a descargas entro a index.cgi?web?descargas.htm ¿Me entienden la idea ? ¡Qué bueno! :)

Tengo todo listo, pero no sé cómo puedo usar SSI desde un CGI.


Sintáxis: (index.cgi) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # ---------------------------- Recoge los parametros
  3. sub toma_entradas {
  4. local($clase);
  5.    if ($ENV{'REQUEST_METHOD'} eq 'GET') {
  6.  
  7.       # Recoge el par name-value
  8.       @pairs = split(/&/, $ENV{'QUERY_STRING'});
  9.    }
  10.    elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
  11.  
  12.       # Lee la entrada
  13.       read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  14.  
  15.       # Recoge el par name-value
  16.       @pairs = split(/&/, $buffer);
  17.    }
  18.  
  19.    foreach $pair (@pairs) {
  20.       ($name, $value) = split(/\=/, $pair);
  21.  
  22.  
  23.         # Desempaquetamos
  24.  
  25.       $name =~ tr/+/ /;
  26.       $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  27.  
  28.  
  29.       $value =~ tr/+/ /;
  30.       $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  31.  
  32.  
  33.         # Eliminamos posibles intentos de ejecución de comandos
  34.  
  35.       $value =~ s/<!--(.|\n)*-->//g;
  36.  
  37.       $QUERY{$name} = $value;
  38.  
  39.   }
  40. $clase=0;
  41. while (($name, $value) = each(%QUERY)){
  42.         $clase++;
  43.   }
  44. return($clase);
  45. }
  46.  
  47. $numero_entradas=&toma_entradas;
  48. # ---------------------------- Termina Recoge Parámetros
  49. print "Content-type:text/html\n\n";
  50. print("<html><table width=\"75%\">
  51.  <tr>
  52.    <td>MENU</td>
  53.    <td><!--#include virtual=\"/web/".$QUERY{"web"}."\"--> </td>
  54.    <td>MENU <!--#exec cgi=\"/cgi-bin/contador.cgi\"--> </td>
  55.  </tr>
  56. </table></html>\n");
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Entonces lo que sucede al entrar al index.cgi?web=home.html, entramos a una página con la tabla, pero sin contenido (solo las palabras menú) y si vemos el código fuente aparece:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <html><table width="75%">
  2.   <tr>
  3.     <td>MENU</td>
  4.     <td><!--#include virtual="/web/home.html"--> </td>
  5.     <td>MENU <!--#exec cgi="/cgi-bin/contador.cgi"--> </td>
  6.   </tr>
  7. </table></html>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Entonces me imprime la página pero no ejecuta mis instrucciones SSI. ¿Cómo puedo lograr que ejecute mis instrucciones SSI?

¿Tendría que modificar
print "Content-type:text/html\n\n";

indicando que es un shtm? ¿cómo lo hago?

¡OJO! MI SERVIDOR SOLO PUEDE EJECUTAR SSI en archivos .shtm .shtml.

Gracias, mis amigos :oops:
deer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2006-01-03 10:50 @493

Publicidad

Re: Usar SSI desde un CGI

Notapor explorer » 2006-01-03 11:29 @520

Pídele al servidor web que te la dé :)

Me explico. Si una página SSI, para formarse, necesita de la ejecución del servidor web, entonces lo que puedes hacer dentro de tu programa es pedir la página al servidor web, con un GET (usando el módulo lwp, por ejemplo). De esa forma tendrás la página completamente formada, incluidos SSI y CGI que estén incluidos en ella.

La pega es que tus estadísticas de acceso a las páginas saldrán con peticiones tuyas, de tu programa.

Si la mayor parte del trabajo del SSI es hacer los includes... yo me decantaría por rehacer todo el diseño de páginas, usando el módulo HTML::Template, por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor deer » 2006-01-03 14:22 @640

Gracias, viejo, por responder.

Sips, buena idea eso de utilizar esa librería, aunque todavía soy novato en Perl. Pero me voy a investigar más sobre esa librería y cómo utilizarla.

Pero, volviendo a la esencia de mi pregunta, ¿se puede ejecutar un comando SSI dentro de un CGI? (por supuesto en la parte de imprimir el HTML).

Saludos.
deer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2006-01-03 10:50 @493

Re: Usar SSI desde un CGI

Notapor explorer » 2006-01-03 15:03 @668

Desde luego, no se puede ejecutar un SSI dentro de un CGI, al menos de forma directa.

Aparte de la primera solución que te he dado, la de que sea el propio servidor web el que te dé la solución, las otras dos alternativas que se me ocurren serían:
  • Hacer un filtrado de la página e intentar imitar la ejecución del SSI, siempre y cuando sea 'fácil' hacer eso. Si sólo hay includes, parece 'fácil'. Pero como cuentas que una página SSI a su vez llama a otra, pues como que veo que esta solución puede ser complicada
  • La otra pasa por utilizar el módulo CGI::SSI. Yo no lo conozco y no sé si te servirá.
Insisto que quizás lo mejor sea pedir al servidor web que te dé las páginas ya formadas.

Yo optaría por hacerlo todo con HTML::Template...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor deer » 2006-01-03 15:41 @695

Sí, estuve buscando bastante información y es un poco complicado ejecutar SSI en un CGI.

Además estuve viendo los módulos instalados de Perl y al parecer no está CGI::SSI :cry: ¡je!

Bueno, mi viejo, entonces quedaría su opción. En mi index.cgi en la parte
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print "Content-type:text/html\n\n";
print("<html><table width=\"75%\">
<tr>
<td>MENU</td>
<td>AQUÍ 1</td>
<td>AQUÍ 2</td>
</tr>
</table></html>\n"
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Entonces en AQUÍ 1, quiero "pegar", o sea, insertar la página con la variable ".$QUERY{"web"}.".
Dicha variable la recogió el cgi cuando lo llamamos index.cgi?web=home.htm.

Entonces debemos ingresar en esa parte un GET del módulo lwp como me dijiste, pero ¿cómo?

Entonces ya haciendo debe ser análogo para la segunda parte.

Bueno, mi viejo, si tienes tiempos no más, de todas maneras estoy leyendo todo lo que puedo.

Saludos, mi viejo. :)
deer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2006-01-03 10:50 @493

Notapor deer » 2006-01-03 15:57 @706

Encontré la solución ¡ji,ji,ji!
Como me dijo el amigo explorer usando LWP y GET.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. # ---------------------------- Recoge los parámetros
  3. sub toma_entradas {
  4. local($clase);
  5. if ($ENV{'REQUEST_METHOD'} eq 'GET') {
  6.  
  7. # Recoge el par name-value
  8. @pairs = split(/&/, $ENV{'QUERY_STRING'});
  9. }
  10. elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
  11.  
  12. # Lee la entrada
  13. read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  14.  
  15. # Recoge el par name-value
  16. @pairs = split(/&/, $buffer);
  17. }
  18.  
  19. foreach $pair (@pairs) {
  20. ($name, $value) = split(/\=/, $pair);
  21.  
  22.  
  23. # Desempaquetamos
  24.  
  25. $name =~ tr/+/ /;
  26. $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  27.  
  28.  
  29. $value =~ tr/+/ /;
  30. $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  31.  
  32.  
  33. # Eliminamos posibles intentos de ejecución de comandos
  34.  
  35. $value =~ s/<!--(.|\n)*-->//g;
  36.  
  37. $QUERY{$name} = $value;
  38.  
  39. }
  40. $clase=0;
  41. while (($name, $value) = each(%QUERY)){
  42. $clase++;
  43. }
  44. return($clase);
  45. }
  46.  
  47. $numero_entradas=&toma_entradas;
  48. # ---------------------------- Termina Recoge Parámetros
  49. use LWP::Simple;
  50. print "Content-type:text/html\n\n";
  51. print("<html><table width=\"75%\"><tr> <td>MENU</td><td>
  52. getprint ($ENV{'QUERY_STRING'});
  53. print("</td> </tr></table></html>\n");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Entonces, al entrar al sitio http://www.sitio.com/index.cgi?http://h ... b/home.htm

Pego el sitio home.htm en la parte que quiero.

Gracias, viejo, por el dato del comando. Saludos
deer
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2006-01-03 10:50 @493

Re: Usar SSI desde un CGI

Notapor explorer » 2006-01-03 15:59 @707

Aquí tienes un ejemplo de uso del LWP::Simple.
Tienes que poner en la función get() el URL completo a la página SSI que quieres incluir.

Actualización: llegó este correo después del tuyo :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor kidd » 2006-01-03 21:35 @941

Hola:

Dentro del sitio hay un tutorial que te podría servir:
http://perlenespanol.com/archives-tut/000034.html

Ahora, también podrías hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. use LWP::Simple;
  5.  
  6.  
  7. print "Content-type:text/html\n\n";
  8.  
  9. print "<html><table width=\"75\%\">\n";
  10. print "<tr>\n";
  11. print "<td>MENU</td>\n";
  12. print "<td>";
  13.  #aquí 1
  14.  print get("http://tusitio.com/aqui2.htm");
  15. print "</td>\n";
  16.  
  17. print "<td>";
  18.  #aquí 2
  19.  print get("http://tusitio.com/aqui2.htm");
  20. print "</td>\n";
  21.  
  22. print "</tr>\n";
  23. print "</table></html>\n";
  24.  
  25.  
  26. exit(1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Aunque te podría convenir más abrir los archivos y desplegarlos en el lugar que quieras, por ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4.  
  5.  
  6. #Directorio absoluto a los archivos
  7. my $root = "/directorio/absoluto";
  8.  
  9. print "Content-type:text/html\n\n";
  10.  
  11. print "<html><table width=\"75\%\">\n";
  12. print "<tr>\n";
  13. print "<td>MENU</td>\n";
  14. print "<td>";
  15.  #aquí 1
  16.  open(FILE,"$root/aqui2.htm");
  17.    print while <FILE>;
  18.  close(FILE);
  19. print "</td>\n";
  20.  
  21. print "<td>";
  22.  #aquí 2
  23.  open(FILE,"$root/aqui2.htm");
  24.    print while <FILE>;
  25.  close(FILE);
  26. print "</td>\n";
  27.  
  28. print "</tr>\n";
  29. print "</table></html>\n";
  30.  
  31.  
  32. exit(1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados