2009-10-10 17 views
10

Sto provando a creare una regola utilizzata in un file .htaccess in modo che corrisponda a una stringa particolare, ad esempio, in questo caso: index..htaccess rewrite regex: corrisponde a tutto tranne "index"

ho pensato che dovrebbe essere possibile abbinare a questa stringa speciale prima e utilizzare [L], ma che non sta funzionando,
e dovrebbe essere possibile utilizzando la seguente espressione regolare, ma causa un errore 500.

voglio abbinare:

  • pagename1
  • pagename2/qualunque cosa
  • pagename3/234/qualunque cosa
  • circa
  • Contattateci
  • (ecc)

ma n ot

  • indice/123
  • indice/124/qualunque cosa

(BTW "index" è il nome di un file senza alcuna estensione, non la mia scelta, questa è una cosa di lavoro)

^(?!index)[\w/\-]+ 

presumo che l'attuazione di apache di espressione regolare non affrontare la regola (?!xxx).

Qualsiasi aiuto/suggerimento sarà molto apprezzato.

risposta

15

È possibile utilizzare RewriteCond s per fare questo, per esempio:

RewriteCond %{REQUEST_URI} !^index 
RewriteRule (.*) index.php?what=$1 

che riscriverà ogni URL che non si attiva in base all'indice . Se si desidera evitarlo ovunque nell'URL, rimuovere ^

+0

Ho potuto farlo funzionare solo usando "! Index" invece di "!^Index". (E sì, "indice" era un inizio della stringa di richiesta, come nella domanda di jezmck sopra). Qualche idea sul perché questo potrebbe essere il caso? – rinogo

+1

Risolto. Anche se lavori in una sottodirectory, l'utilizzo di "RewriteCond% {REQUEST_URI}" utilizza l'intero URI della richiesta, quindi devi includere il percorso www nella directory corrente. Nel mio caso, questo significa che ho usato: "RewriteCond% {REQUEST_URI}! ^/R/index $" (il file .htaccess in cui sto lavorando è nella directory 'r'). – rinogo

3

(Si prega di leggere i commenti che ho i miei dubbi e non ho mai avuto problemi, mentre dà una molto più pulito .htaccess file, ma:. Usando RewriteCondpotrebbe essere preferito rispetto all'uso di RewriteRule con un trattino, a causa di come rulesets are processed ?)

Basta usare RewriteRule come segue, per non riscrittura (il trattino), e fermare la successiva riscrittura (la [L]) per tutto ciò che inizia con index/:

# Do not rewrite anything that starts with index/ 
RewriteRule ^index/ - [L]

Dopo questo, fai una riscrittura che ti piace.

O forse anche limitare un po 'prima:

# Do not rewrite files, directories or symbolic links 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule . - [L]
+0

Ah, che potrebbe essere la risposta che stavo cercando, non sapevo di '-' in .htaccess – jezmck

+1

I conds sono più sicuri. Se in seguito hai un altro indice di corrispondenza delle regole, le cose potrebbero diventare strane. [L] non è l'ultimo passaggio mai, termina semplicemente il passaggio corrente, ci sono vari casi in cui la richiesta passa più di una volta attraverso le regole. –

+0

@Vinko, più passaggi sono buoni da ricordare. Ma come sarebbe un RewriteCond (specialmente un RewriteCond negativo) non essere soggetto a strane partite durante un altro passaggio? – Arjan

1

Apache ha utilizzato tre diverse implementazioni di espressioni regolari. Il primo era System V8, poiché Apache 1.3 utilizzava POSIX ERE e poiché Apache 2 utilizza PCRE.E solo PCRE supporta le asserzioni look-ahead. Quindi hai bisogno di Apache 2 per usare quella regola.

Ma ora alla tua domanda. Se si utilizza questa regola:

RewriteRule ^index/ - [L] 

tutto ciò che inizia con /index/ dovrebbe essere Catturato da questa regola e dovrebbe essere applicata nessuna ulteriore regola.

Ma se questo non funziona, provate questo:

RewriteRule !^index/ … 

Ancora una volta, questa regola verrà applicata su qualsiasi richiesta che è sentiero URL non inizia con /index/.

E se si vuole catturare qualsiasi cosa, da l'URL, utilizzare una condizione RewriteCond per testare il percorso completo URL stesso (%{REQUEST_URI}) o solo la partita di uno dei tuoi gruppi di pattern:

RewriteCond %{REQUEST_URI} !^/index/ 
RewriteRule (.*) … 
# or 
RewriteCond $1 !^index$ 
RewriteRule ^([^/]+)/(.*) … 
Problemi correlati