Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

312
Vistas
¿Cómo usar RewriteRule de modo que $_SERVER['REQUEST_URI'] también se modifique para PHP?

Con este .htaccess :

 RewriteEngine On RewriteRule foo/(.*) /foo-$1 # here I tried [L], [PT], [C], etc. RewriteRule . index.php [L]

Probé todas las banderas posibles para la primera RewriteRule, pero siempre, este código PHP:

 <?php echo $_SERVER['REQUEST_URI']; ?>

siempre repite /foo/bar en lugar de /foo-bar , al acceder a http://example.com/foo/bar . ¿Por qué?

¿Cómo hacer que RewriteEngine de Apache también modifique REQUEST_URI que verá PHP?

Nota: no quiero [R] porque una redirección generaría una nueva solicitud del navegador y cambiaría la URL que se muestra en la barra de URL, lo cual no quiero.

Consulte también RewriteRule cuando la cadena de sustitución no es una ruta de archivo sino una URL que debe ser procesada por las siguientes reglas .

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Creo que lo que intentas hacer es imposible sin algún trabajo. He proporcionado 2 soluciones en esta publicación, una usando auto_prepend_file y otra usando mod_proxy.

Solución 1: usando auto_prepend_file

Mire el script a continuación, esto no establece directamente el REQUEST_URI global, sino que lo sobrescribe en PHP, con el siguiente código:

.htaccess

 php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 RewriteRule . index.php [L]

Asegúrate de agregar esta línea:

 php_value auto_prepend_file "before.php"

antes.php

En este script, puede reemplazar REQUEST_URI:

Me gusta:

 $_SERVER['REQUEST_URI'] = "/" . str_replace('/', '-', ltrim($_SERVER['REQUEST_URI'], "/"));

Puede mejorar aún más este script, pero creo que el concepto es claro.

índice.php

Index.php no se ve afectado pero contiene la regla reescrita:

 var_dump($_SERVER['REQUEST_URI']); //string(7) "/foo-bar"

Una solicitud a http://localhost/foo/bar?test es ahora: string(13) "/foo-bar?test"

Actualizar

Al usar [L], puede obtener la URL reescrita de la siguiente manera:

 var_dump($_SERVER['REDIRECT_URL']); # /foo-bar

Entonces el .htaccess se convierte en:

 php_value auto_prepend_file "before.php" RewriteEngine On RewriteRule foo/(.*) /foo-$1 [L] # please note [L] here RewriteRule . index.php [L]

Por lo tanto, before.php puede ser reemplazado por:

 $_SERVER['REQUEST_URI'] = $_SERVER['REDIRECT_URL'];

Actualizar la solución 2; usando mod_proxy

Descubrí que también puedes usar mod proxy:

Tuve que habilitar los siguientes módulos:

 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_connect_module modules/mod_proxy_connect.so

Ahora su .htaccess se cambia a (observe la bandera [P]):

 RewriteEngine On RewriteRule ^foo/(.+)$ /foo-$1 [L,P] RewriteRule . index.php

Esto enviará todas las solicitudes de foo/bar a /foo-bar y cambiará $_SERVER['REQUEST_URI'] consecuencia.

 var_dump($_SERVER['REQUEST_URI']); //output: string(8) "/foo-bar"

Sin embargo, creo que usar el archivo de prefijo de PHP es una forma más eficiente.

over 4 years ago · Santiago Trujillo Denunciar

0

$_SERVER['REQUEST_URI'] devuelve el original-uri Apache y no current-uri .

Directiva CGIVar

Con este archivo .htaccess :

 CGIVar REQUEST_URI current-uri RewriteRule (.*) index.php [L]

entonces una solicitud a example.com/hello/world dará:

 $_SERVER["REQUEST_URI"] "/index.php" $_SERVER["REDIRECT_URL"] "/hello/world"

Sin la línea CGIVar , daría "/hello/world" tanto para REQUEST_URI como para REDIRECT_URL .

over 4 years ago · Santiago Trujillo Denunciar

0

Después de más investigaciones, parece que PHP siempre verá la URL original en $_SERVER['REQUEST_URI'] y no el objetivo de RewriteRule. (fuente autorizada necesaria aquí).

Por cierto, el destino de una RewriteRule suele ser un archivo que procesará la solicitud, excepto si usamos un indicador de redirección [R], entonces en este caso el navegador realizará una nueva solicitud a la nueva URL (y la URL del navegador cambios de barra).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda