2009-04-03 12 views
5

a quanto pare c'è una limitazione (9) su quanti backreference è possibile accedere in RewriteRules htaccess ..numero mod_rewrite di parametri/backreference limitazione

ma abbiamo una RewriteRule che richiede più di 9 parametri, qualcosa di simile questo:

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] 

che cosa succede quando si tenta di accedere "$ 10", è che usa $ 1 e mette un 0 proprio accanto ad esso.

Qualcuno è stato in grado di risolvere questo problema, soluzioni alternative o altro?

Grazie!

risposta

17

In realtà, non è necessario acquisire tutto. Scrivi gruppi non catturanti (introdotti con "?:") per le cose che non vuoi riutilizzare, questo dovrebbe darti ancora un po 'di respiro. Confronta:

 
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 

Ma con mod_rewrite da solo, non è possibile andare più in alto di 9 riferimenti. Se hai bisogno di più, utilizza un'alternativa, ad esempio acquisendo solo le parti più importanti in riscrittura e esegui l'elaborazione delle stringhe con il resto dell'URL nella tua app.

+1

Sei il mio eroe di oggi – Korcholis

5

Una soluzione potrebbe essere quella di utilizzare la stessa espressione regolare, senza cattura e passare la richiesta a index.php

Quindi utilizzare index.php per esplodere l'URI della richiesta da parte delle barre in avanti e si può lavorare da lì con i dati.

9

Uno, anche se piuttosto stupido, sarebbe l'idea di eseguire la riscrittura in due passaggi, ovvero la catena due RewriteRule s con la prima regola riscrivendola in un formato intermedio.

+1

+1, perché sebbene (come si fa notare) sia un'idea "stupida", è in effetti valida. – UnkwnTech