2009-04-03 23 views
5

Al parecer hay una limitación (9) de la cantidad de referencias hacia atrás se puede acceder en RewriteRules htaccess ..número mod_rewrite de la limitación de parámetros/referencias hacia atrás

pero tenemos un RewriteRule que requiere más de 9 parámetros, algo así como esto:

RewriteRule ^([^/]+)/b([0-9]+)(/a([0-9]+))?(/v([0-9]+))?(,([0-9]+))?(/(ajax|share))?(,complete)?$ /index.php?control=sites&site=brands&control_file=version_select&name=$1&campaign_id=$2&answer=$4&page=$8&option=$10&video_id=$6&page_type=research [L] 

Entonces, ¿qué sucede cuando se intenta acceder a "$ 10", es que utiliza $ 1 y pone un 0 al lado de ella.

¿Alguien ha podido resolver este problema, alguna solución alternativa o algo por el estilo?

Gracias!

Respuesta

17

En realidad, no necesita capturar todo. Escriba los grupos que no capturaron (introducido con "?:") para las cosas que no desea reutilizar, esto debería darle un respiro de nuevo. Compare:

 
Yours:      Mine: 
------------------------- --------------------------- 
^([^/]+)/b   $1  ^([^/]+)/b   $1 
([0-9]+)   $2  ([0-9]+)    $2 
(/a([0-9]+))?  $4  (?:/a([0-9]+))?  $3 
(/v([0-9]+))?  $6  (?:/v([0-9]+))?  $4 
(,([0-9]+))?  $8  (?:,([0-9]+))?  $5 
(/(ajax|share))? $10!  (?:/(ajax|share))? $6 
(,complete)?$  $11!  (,complete)?$   $7 

Pero con mod_rewrite solo, no puede ir más allá de 9 referencias anteriores. Si necesita más, use una alternativa, por ejemplo, capturar solo las partes más importantes en la reescritura y hacer algo de procesamiento de cadenas con el resto de la URL en su aplicación.

+1

Eres mi héroe de hoy – Korcholis

5

Una solución podría ser utilizar la misma expresión regular, sin capturas, y transmitir la solicitud a index.php

A continuación, utilice index.php hacer explotar la URI de la solicitud por las barras diagonales y se puede trabajar desde allí con los datos.

9

Una idea, aunque bastante tonta, sería hacer la reescritura en dos pasos, es decir, encadenar dos RewriteRule s con la primera regla reescribiéndolo en algún formato intermedio.

+1

+1, porque aunque (como usted señala) es una idea "tonta", de hecho es válida. – UnkwnTech