Hoy, estaba ayudando a alguien con un estuche de uso .htaccess
, y came up with a solution que funciona pero no puedo resolverlo por mi cuenta.¿Por qué esto causa un ciclo de petición infinito?
Quería ser capaz de:
- Examinar para
index.php?id=3&cat=5
- Ver la barra de direcciones leer
index/3/5/
- tenga el contenido sirve de
index.php?id=3&cat=5
Los dos últimos pasos son bastante típico (generalmente del usuario que ingresa index/3/5
en primer lugar), pero el primer paso era obligatorio porque todavía tenía algunos enlaces de formato antiguo en su sitio y, por cualquier razón, no podrían cambiarlos. Por lo tanto, necesitaba admitir ambos formatos de URL y hacer que el usuario siempre terminara viendo el embellecido.
Después de muchas idas y venidas, se nos ocurrió la .htaccess
siguiente archivo:
RewriteEngine on
# Prevents browser looping, which does seem
# to occur in some specific scenarios. Can't
# explain the mechanics of this problem in
# detail, but there we go.
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
# Hard-rewrite ("[R]") to "friendly" URL.
# Needs RewriteCond to match original querystring.
# Uses "?" in target to remove original querystring,
# and "%n" backrefs to move its components.
# Target must be a full path as it's a hard-rewrite.
RewriteCond %{QUERY_STRING} ^id=(\d+)&cat=(\d+)$
RewriteRule ^index\.php$ http://example.com/index/%1/%2/? [L,R]
# Soft-rewrite from "friendly" URL to "real" URL.
# Transparent to browser.
RewriteRule ^index/(\d+)/(\d+)/$ /index.php?id=$1&cat=$2
Si bien podría parecer que es un caso de uso un tanto extraña (" por qué no sólo tiene que utilizar el correcto enlaces en primer lugar? ", puede preguntar), simplemente vaya con eso. Independientemente del requisito original, este es el escenario y me está volviendo loco.
Sin la primera regla, el cliente ingresa en un bucle de solicitud, intentando GET /index/X/Y/
repetidamente y obteniendo 302
cada vez. La verificación en REDIRECT_STATUS
hace que todo funcione sin problemas. Pero hubiera pensado que después de la regla final, no se cumplirían más reglas, el cliente no haría más solicitudes (nota, no [R]
), y todo sería gravy.
Entonces ... ¿por qué esto daría como resultado un ciclo de solicitud cuando saco la primera regla?
Para nada uso extraño en mi opinión – Cyclone