• Publicidad

Problemas con Mod_rewrite

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Problemas con Mod_rewrite

Notapor hugo11ab » 2013-12-04 13:49 @617

¿Quá tal? Nuevamente solicitando de su valiosa ayuda.

Estoy tratando de enmascarar las URL de mi página web para evitar que en la barra de direcciones se vean los parámetros que estoy pasando. Buscando documentación encontré el módulo "MOD_REWRITE" de Apache. Se podía solucionar el problema así que empecé a leer el manual que está en este foro, pero cuando mando a llamar a la página enmascarada, el navegador me manda el error 404 donde indica que no ha encontrado la página.

Dentro del archivo de configuración del servidor Apache 2.2.4 (http.conf) verifiqué que la siguiente línea no estuviera comentada:
LoadModule rewrite_module modules/mod_rewrite.so

La carpeta donde tengo los scripts es la /var/www/cgi-bin/scripts/.

Dentro de la carpeta scripts generé el archivo .htaccess el cual contiene las siguientes directivas
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
RewriteEngine On
RewriteRule ^correspondencia/acceso.htm cgi-bin/scripts/acceso.cgi [L,NC]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Alguien sabe dónde pueda estar el error?
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Publicidad

Re: Problemas con mod_rewrite

Notapor explorer » 2013-12-04 15:25 @684

Debes mirar en los archivos access.log y error.log para saber qué puede estar pasando para sacar el 404.

Con el mod_rewrite también puedes activar el archivo de registro, con lo que puedes ver el proceso de renombrado.

Tienes puesta una regla RewriteRule, pero no hay ninguna regla RewriteCond, por lo cual la regla de reescritura se aplica a todos los URL que entran.

La expresión regular dice que esperas un URL que comience por 'correspondencia'. Lo más seguro es que sea así: '/correspondencia...' Consulta el access.log para ver el URL que recibe el servidor.

Una forma de evitar la vista de los parámetros en el URL, es pasar la transmisión de datos de GET a POST.
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

Re: Problemas con Mod_rewrite

Notapor danimera » 2013-12-04 15:26 @684

Creo que el htacess lo debes poner en la raíz de tu httdocs y no dentro de un directorio, es mejor por fuera.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Problemas con Mod_rewrite

Notapor hugo11ab » 2013-12-04 17:37 @775

Gracias, explorer y danimera por sus sugerencias.

Ya revisé los log y lo que arrojan es que no encuentran la página:

access.log:
10.1.66.197 - - [04/Dec/2013:16:12:44 -0600] "GET /correspondencia/acceso.htm HTTP/1.1" 404 231 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; BTRS102065; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2)"

error.log:
[Wed Dec 04 16:12:44 2013] [error] [client 10.1.66.197] File does not exist: /var/www/html/correspondencia

Ya lo puse como me indicaste, explorer, y da el mismo error.

También ya saqué el archivo a /var/www, /var/www/cgi-bin, /var/www/html y sigue arrojando el mismo error.

Estoy utilizando el método GET debido a que en la pantalla principal tengo una tabla con varias filas y cada fila contiene un identificador que cuando el usuario le da un clic al identificador muestra la información relacionada a la fila que se está consultando.

explorer escribiste:La expresión regular dice que esperas un URL que comience por 'correspondencia'. Lo más seguro es que sea así: '/correspondencia...'


También cambié el archivo como comentas en el párrafo anterior y es lo mismo.

RewriteEngine On
RewriteRule '/correspondencia/acceso.htm' '/cgi-bin/scripts/acceso.cgi' [L,NC]

No sé qué pueda estar fallando.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas con Mod_rewrite

Notapor explorer » 2013-12-04 19:50 @868

Recuerda que cada vez que hagas un cambio en el archivo .htaccess o en el archivo de configuración del dominio en el directorio de configuración del Apache, debes decirle a Apache que recargue esa configuración.

En los Linux se hace así:

/etc/init.d/apache2 reload

o

service apache2 reload

En las reglas del rewrite has puesto comillas simples: no son necesarias. Sería algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
RewriteEngine On
RewriteRule ^/correspondencia/acceso.htm   /cgi-bin/scripts/acceso.cgi   [L,NC]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El error que sale es porque, precisamente, no está haciendo ninguna redirección.

Pero... una pregunta... ¿por qué no puedes llamar de forma directa a acceso.cgi desde el formulario web de la página?
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

Re: Problemas con Mod_rewrite

Notapor hugo11ab » 2013-12-04 20:27 @894

Gracias nuevamente. Actualmente así está funcionando la página, mando a llamar directamente a los cgi desde el navegador, pero en algunos casos, tengo unos scripts que me muestran una tabla con varios registros y cada vez que el usuario quiera ver el detalle de esos registros en el navegador pone en la barra de direcciones algo como esto:

http://10.1.66.21/cgi-bin/scripts/detal ... dyZXNhcj0x

Entonces lo que pretendo hacer con el módulo mod_rewrite y el archivo htaccess es que en lugar de mostrarme toda la URL con los parámetros nada más me mostrará:

http://10.1.66.21/cgi-bin/scripts/detal ... dencia.cgi

o

http://10.1.66.21/cgi-bin/scripts/detal ... dencia.htm

Con respecto a lo que me comentas efectivamente no se está haciendo la redirección.

He hecho todos los pasos que se indican en el tutorial y aún no sé por qué no me redirecciona. No sé si le tenga que mover más cosas al httpd.conf.

http://perlenespanol.com/articulos/archivo/000180.html
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas con Mod_rewrite

Notapor explorer » 2013-12-04 20:55 @913

sí, pero... si la petición fuera POST, entonces se te quedaría en

http://10.1.66.21/cgi-bin/scripts/detal ... dencia.cgi

¿No es más fácil que montar todo el jaleo del mod_rewrite?
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

Re: Problemas con Mod_rewrite

Notapor hugo11ab » 2013-12-05 18:08 @797

Nuevamente, gracias explorer, estoy tratando de pasarlo por el método POST pero no encuentro la manera, aquí muestro la manera de cómo lo tengo:

my $table2 = new HTML::Table(-cols=>5,-border=>1,-bgcolor=>0,-width=>"100%",-spacing=>0,-padding=>3,-style=>"border-collapse:collapse;border-color:#287443");
$table2->setCell(1,1,"<font class=\"sBL3b\">FOLIO</font>");
$table2->setCell(1,2,"<font class=\"sBL3b\">RESPONDABLE </font>");
$table2->setCell(1,3,"<font class=\"sBL3b\">ASUNTO</font>");
$table2->setCell(1,4,"<font class=\"sBL3b\">STATUS <br> DOCUMENTO</font>");
$table2->setCell(1,5,"<font class=\"sBL3b\">DETALLE</font>");
my $r = 2;

($rs,$fetch) = record(
db=>"$base",
tabla=>"correspondencia",
condicion=>"WHERE cve_tipo_documento='OFICIO' order by 1",
campos=>"id_documento,folio_documento,responsable,asunto,clv_status",
visible=>"no"
);
while($fetch->()) {
my $valores = encode_base64("id_documento=$$rs{id_documento}&status=$$rs{status}&botonRegresar=1");

my $status_doc = "EN TRAMITE";
my $clase_status_doc = "naranja";
if ($$rs{status_documento} eq 'A') { $status_doc = "CONCLUIDO"; $clase_status_doc = "verde"; }

$table2->setCell($r,1,"<font class=verde>$$rs{folio}</font>");
$table2->setCell($r,2,"<font class=negro>$$rs{responsable}</font>");
$table2->setCell($r,3,"<font class=negro>$$rs{asunto}</font>");
$table2->setCell($r,4,"<font class=$clase_status_doc>$status_doc</font>");

#esta es la linea que quiero pasar por el metodo post
$table2->setCell($r,5, "<a href=\"/cgi-bin/scripts/busqueda_detalle_correspondencia.cgi?valores=$valores\"
class=\"detalle\"> <span> DETALLE </span> </a>");
$r++;
}
$table2->setRowBGColor(1,"#287443");
$table2->setRowHeight(1,"20");
$table2->setColAlign(1,"CENTER");
$table2->setColAlign(2,"CENTER");
$table2->setColAlign(3,"LEFT");
$table2->setColAlign(4,"CENTER");
$table2->setColAlign(5,"CENTER");


my $table0 = new HTML::Table(-rows=>4,-cols=>1,-border=>1,-bgcolor=>0,-width=>"100%",-spacing=>0,-padding=>3,-style=>"border-collapse:collapse;border-color:#287443");
$table0->setCell(1,1,"<font class=\"sBL3b\">RELACION DE DOCUMENTOS</font>");
$table0->setCell(2,1,"<br>");
$table0->setCell(3,1,$table2->getTable);

$table0->setRowBGColor(1,"#287443");
$table0->setRowHeight(1,"20");
$table0->setRowHeight(2,"10");
$table0->setCellAlign(1,1,"CENTER");
$table0->setCellAlign(2,1,"CENTER");
$table0->setCellAlign(3,1,"CENTER");


print $session->header;
print start_html(-title=>'CAPACITACION',
-script=>[
{ -language => 'JavaScript', -src => '../../documentos/js/busqueda_docs.js'},
],
-BGCOLOR=>'#ffffff',
-style=> [
],
-link=>'#0000ee',
-vlink=>'#0000ee'
);

print start_multipart_form(-action=>$script_name,
-name=>'form',
-id =>'form'
);
print $table0;

print end_form();
print end_html();
exit;

Ya cambié los href por botones y la pasé los valores mediante hiddens, pero no los pasa.
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016

Re: Problemas con Mod_rewrite

Notapor explorer » 2013-12-05 22:39 @985

No sé por qué estás usando start_multipart_form(). ¿No te vale un simple start_form()? De hecho, estás cerrando el formulario con end_form(), y no con end_multipart_form(), así que creo que ahí es donde está equivocado.

Y luego, dentro de start_form(), debes indicar el método, así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print start_form(
  2.     -method => 'POST',
  3.     -action => $script_name,
  4.     -name   => 'form',
  5.     -id     => 'form',
  6. );
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero... la clave está en la línea que marcas que quieres pasar a método POST. Resulta que es un enlace que depende de $valores, así que el problema está en cómo pasar esos $valores que no sea a través de un método GET, como lo tienes ahora.

Hay dos soluciones básicas: crear un formulario por cada fila de la tabla (y puedes crear campos ocultos, cada uno con $valores distintos).

O cambiar los <a> por botones, todos ellos con el mismo valor ('DETALLE'), pero con nombres distintos (puede ser $valores si esos valores no tienen caracteres extraños, o te vale con el número de fila de la tabla, ya que puedes repetir la consulta y así sabes a qué fila corresponde la petición). O usar botones de radio.

En este último caso, el problema es saber cómo leerlo luego en el cgi. Una forma sería crear algo así como nombres de los botones: "V$valores", y luego, en el cgi, recorrer los parámetros uno a uno hasta encontrar aquel que comienza por "V".

No sé... depende un poco del aspecto de $valores...
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

Re: Problemas con Mod_rewrite

Notapor hugo11ab » 2013-12-09 14:09 @631

Muchas gracias, explorer. Para esta aplicación utilicé una ventana modal la cual me oculta los parámetros al momento de abrirla y tenía otra aplicación parecida que necesitaba que se abriera en la misma página y utilicé tu idea de poner botones tipo radio en lugar de enlaces y me funcionó a la perfección.

Aquí dejo el código de cómo quedó:

my $table2 = new HTML::Table(-cols=>5,-border=>1,-bgcolor=>0,-width=>"100%",-spacing=>0,-padding=>3,-style=>"border-collapse:collapse;border-color:#287443");
$table2->setCell(1,1,"<font class=\"sBL3b\">FOLIO</font>");
$table2->setCell(1,2,"<font class=\"sBL3b\">RESPONDABLE </font>");
$table2->setCell(1,3,"<font class=\"sBL3b\">ASUNTO</font>");
$table2->setCell(1,4,"<font class=\"sBL3b\">STATUS <br> DOCUMENTO</font>");
$table2->setCell(1,5,"<font class=\"sBL3b\">DETALLE</font>");
my $r = 2;

($rs,$fetch) = record(
db=>"$base",
tabla=>"correspondencia",
condicion=>"WHERE cve_tipo_documento='OFICIO' order by 1",
campos=>"id_documento,folio_documento,responsable,asunto,clv_status",
visible=>"no"
);
while($fetch->()) {
my $valores = encode_base64("id_documento=$$rs{id_documento}&status=$$rs{status}&botonRegresar=1");

my $status_doc = "EN TRAMITE";
my $clase_status_doc = "naranja";
if ($$rs{status_documento} eq 'A') { $status_doc = "CONCLUIDO"; $clase_status_doc = "verde"; }

$table2->setCell($r,1,"<font class=verde>$$rs{folio}</font>");
$table2->setCell($r,2,"<font class=negro>$$rs{responsable}</font>");
$table2->setCell($r,3,"<font class=negro>$$rs{asunto}</font>");
$table2->setCell($r,4,"<font class=$clase_status_doc>$status_doc</font>");

#asi quedo la sustitucion
$table2->setCell($r,5, "<input name='folio_consultado' value='$valores' type='radio'>");


#$table2->setCell($r,5, "<a href=\"/cgi-bin/scripts/busqueda_detalle_correspondencia.cgi?valores=$valores\"
class=\"detalle\"> <span> DETALLE </span> </a>");
$r++;
}
$table2->setRowBGColor(1,"#287443");
$table2->setRowHeight(1,"20");
$table2->setColAlign(1,"CENTER");
$table2->setColAlign(2,"CENTER");
$table2->setColAlign(3,"LEFT");
$table2->setColAlign(4,"CENTER");
$table2->setColAlign(5,"CENTER");


my $table0 = new HTML::Table(-rows=>4,-cols=>1,-border=>1,-bgcolor=>0,-width=>"100%",-spacing=>0,-padding=>3,-style=>"border-collapse:collapse;border-color:#287443");
$table0->setCell(1,1,"<font class=\"sBL3b\">RELACION DE DOCUMENTOS</font>");
$table0->setCell(2,1,"<br>");
$table0->setCell(3,1,$table2->getTable);
#Añadí este botón para pasar los parámetros mediante el método POST
$table0->setCell(4,1, "<br>" . submit(-name=>'opc',-value=>'Contestar Documento',-class=>'Bsbttn') ."<br>");

$table0->setRowBGColor(1,"#287443");
$table0->setRowHeight(1,"20");
$table0->setRowHeight(2,"10");
$table0->setCellAlign(1,1,"CENTER");
$table0->setCellAlign(2,1,"CENTER");
$table0->setCellAlign(3,1,"CENTER");


print $session->header;
print start_html(-title=>'CAPACITACION',
-script=>[
{ -language => 'JavaScript', -src => '../../documentos/js/busqueda_docs.js'},
],
-BGCOLOR=>'#ffffff',
-style=> [
],
-link=>'#0000ee',
-vlink=>'#0000ee'
);

print start_form(-action=>$script_name,
-name=>'form',
-id =>'form',
-onsubmit =>'return Contestar()' #con esta función válido que el usuario seleccione un radio
);
print $table0;

print end_form();
print end_html();
exit;

¡¡¡Muchísimas gracias!!!
hugo11ab
Perlero nuevo
Perlero nuevo
 
Mensajes: 77
Registrado: 2006-07-22 23:24 @016


Volver a Web

¿Quién está conectado?

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