mod_rewrite reemplaza todas las instancias de ampersand con %26 para más adelante
-
19-09-2019 - |
Pregunta
Simplemente no quiero usar el signo comercial en mi URL para poder pasar el signo comercial más abajo en mi sistema cuando se solicita un archivo.El problema es que Apache lo trata de manera diferente.no se como
Ya reescribí el archivo solicitado en index.php?url=$1 para poder ver qué era, pero si tiene un signo comercial allí, ¡no puede continuar!
¿Cómo puedo escapar del signo comercial o convertirlo en su hexadecimal igual (% 26)?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>`
Solución
La forma correcta de escapar del signo comercial en una cadena de consulta modificada por mod_rewrite
es
%2526
si está siendo manejado por php.
Cuando Apache lo reescribe, se convierte en %2526
a %26
en qué php luego se convierte &
y se almacena en la variable de consulta.
Utilizando el B
La regla de reescritura también funciona, pero todos los signos más en el parámetro permanecen signos más en php.
El ejemplo del mundo real al que tuve que enfrentarme:
/group/Simon+%26+Garfunkel
Con B
se reescribe a
group.php?group=Simon+%26+Garfunkel
y en php obtienes
$group="Simon+&+Garfunkel";
cuando tu querías
$group="Simon & Garfunkel"
Con B necesitas
/group/Simon%20%26%20Garfunkel
que funciona bien.
sin B
usted obtiene
group.php?group=Simon%20&%20Garfunkel
y terminas con
$group="Simon ";
porque el &
divide cadenas de consulta.
Pero si escapas dos veces
/group/Simon+%2526+Garfunkel
se reescribe a
group.php?group=Simon%20%26%20Garfunkel
y terminas con
$group="Simon & Garfunkel";
como se esperaba.
Si la URL NO es analizada por mod_rewrite
en una "URL limpia", entonces podemos usar %26
muy bien.
Otros consejos
primero asegúrese de la dirección URL que está construyendo haber escapado el símbolo & a 26% así que no es un símbolo de unión cuando se pone a su servidor. a continuación, en su regla de reescritura agregar la etiqueta B, así que no va a convertir de nuevo a la Y:
RewriteRule ^ (. *) $ Index.php? Url = $ 1 [B, QSA, L]
Esta etiqueta B salvó mi trasero después de 2 días de tratar diferentes reglas de reescritura.
Añadir
RewriteRule ^(.*)\&(.*)$ $1\%26$2
Para sus reglas de reescritura.
Trate de poner esta regla por encima de la suya:
RewriteRule ^([^&]*)&(.*) $1\%26$2 [N]
Además, si desea enviar de vuelta al navegador una redirección con el símbolo de unión en la dirección URL puede añadir la [NE] bandera al final de la RewriteRule.
RewriteRule ^/(.*) /index.php?p=yourpage_\%26_something_else [NC,NE,R=301,L]