2009-11-11 14 views
5

Ho un sito Web in cui varie parti parse request URLs by themselves e altre no (ad esempio un forum vBulletin). Il .htaccess che devo inviare richieste agli script appropriapi è:Alcuni RewriteCond influiscono su più regole

# wiki, shop, admin 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !(.*)\.js 
RewriteRule ^wiki/(.*)$ w/index.php?title=$1 [PT,L,QSA] 
RewriteRule ^wiki/*$ wiki/ [L,QSA] 
RewriteRule ^shop/ /shop/shop.php [NC,L] 
RewriteRule ^forum/admincp/pkr/ /forum/admincp/pkr/pkr.php [NC,L] 

Questo non funziona come mi aspettavo. Ho dimenticato che le condizioni di riscrittura sono applicate solo alla prima regola che le segue. La domanda è Come posso applicare quelli RewriteCond a tutte quelle regole senza dover copypaste 4 volte?


ciò che va male è questo:

  • /negozio/esempio è riscritto per /shop/shop.php
  • /shop/shop.php è poi di nuovo riscritto per/negozio /shop.php (leggi: abbiamo un ciclo infinito). Questo non accadrebbe se questa condizione è stata applicata a questa regola di riscrittura, perché /shop/shop.php è un file vero e proprio:

    RewriteCond% {} REQUEST_FILENAME -f

Quindi sì ...

risposta

5

Inverti l'espressione e collegarlo a una regola di rottura:

RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} (.*)\.js 
RewriteRule^- [L] 
0

o semplicemente fare un'altra condizione come

RewriteCond %{THE_REQUEST} !shop.php 

o meglio ancora

RewriteCond %{THE_REQUEST} !(.*)\.php 
5

non capivo la risposta di Gumbo ecco cosa ho trovato ciò che funziona:

Invece di corrispondenza qualcosa e l'esecuzione di più di un RewriteRule da quel test , puoi invertire la regola della partita (come usare un! firmare) e se non lo trova, salta oltre il numero X di regole. Come ad esempio:

RewriteCond %{HTTP_HOST} !^www.mydomain.com [NC] 
RewriteRule . - [S=2] # Skip the below X lines if the above test passes 
RewriteRule ^/images/(.*) /resources/images/$1 [L] 
RewriteRule ^/favicon.ico /resources/favicon.ico [L] 

Quindi, se il HTTP_HOST inizia con www.mydomain.com voglio le ultime due RewriteRules da elaborare. Ma quello che sto facendo è che se HTTP_HOST fa non inizia con www.mydomain.com, salta le prossime due regole. La prima RewriteRule: . - [S=2] in realtà non cambia nulla, ma il flag S = 2 significa saltare le prossime regole X = 2.

Un po 'di logica inversa se me lo chiedi.

+0

Grazie per il tempo di spiegare la risposta per il resto di noi! +1 –

+1

È piuttosto interessante, ma anche un po 'complicato, se qualcuno aggiunge una regola di riscrittura in un secondo momento e dimentica di aggiornare il numero di righe da saltare, si ottiene un comportamento indesiderato. – Leven

Problemi correlati