.htaccess mod_rewrite - come escludere la directory dalla regola di riscrittura


145

Ho 8 righe di regole di riscrittura nel mio file .htaccess. Devo escludere due directory fisiche sul mio server da queste regole, in modo che possano diventare accessibili. Per ora tutte le richieste vengono inviate al file index.php.

Directory da escludere: "admin" e "user".

Quindi le richieste http: http://www.domain.com/admin/ non devono essere passate al file index.php.

ErrorDocument 404 /index.php?mod=error404

Options  FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

Penso che dopo aver dimenticato i quantificatori dopo [^/]uno spazio semplice se non consentito lì (deve essere evitato \<space>).
Gumbo,

Vero Gumbo, buona cattura :). dovrebbe essere ^ ([^ /] +).
Kelvin,

Risposte:


287

Prova questa regola prima delle altre tue regole:

RewriteRule ^(admin|user)($|/) - [L]

Questo terminerà il processo di riscrittura.


Ciao Gumbo, il tuo codice ha funzionato se l'utente digita domain.com/admin/ (con barra finale) ma non senza di essa. Cosa puoi cambiare per far funzionare entrambi i casi? Grazie
Kelvin il

@Kelvin: l'alternanza ($|/)dovrebbe gestire entrambi i casi.
Gumbo,

Non è meglio usare RewriteCond qui invece di RewriteRule?
rineez,

7
@rineez RewriteCondrichiede sempre un oggetto a RewriteRulecui è collegato. E l'aggiunta di questa condizione come negata RewriteConda tutti RewriteRulepuò essere piuttosto voluminosa, una singola RewriteRulecome un'uscita sopra quelle che dovrebbero essere ignorate in questo caso è più elegante.
Gumbo,

3
@Ergec Significa "non cambiare nulla".
Gumbo,

112

Quello che potresti anche fare è mettere un file .htaccess contenente

RewriteEngine Off

Nelle cartelle che si desidera escludere dalla riscrittura (secondo le regole in un file .htaccess che si trova più in alto nella struttura). Semplice ma efficace.


18
+1 ~ .htaccess opera in modo gerarchico, quindi le cartelle locali hanno la precedenza sui loro genitori, proprio come una normale cascata in CSS o MVC.
Atari,

4
c'è solo una cosa che dovresti tenere a mente: l'attivazione dei file .htaccess (impostazione AllowOverridesu qualsiasi cosa che non sia Nonenella configurazione di Apache) forza Apache a cercare .htaccess su ogni richiesta. quindi se hai un sito web / server web molto frequentato, l'accesso al filesystem / hard disk potrebbe avere un impatto notevole sulle prestazioni ...
bohrsty

Consulenza perfetta per la convalida del rinnovo dei certificati SSL tramite il metodo file. Non è necessario modificare nulla al di fuori delle directory temporanee o nel file vhost. Al termine della convalida, puoi semplicemente eliminare l'intera cartella e il gioco è fatto. Semplicemente fantastico.
Countzero,

25

aggiungi una condizione per verificare la directory admin, qualcosa del tipo:

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/([^/] )\.html$ index.php?lang=$1&mod=$2 [L]

RewriteCond %{REQUEST_URI} !^/?(admin|user)/
RewriteRule ^([^/] )/$ index.php?lang=$1&mod=home [L]

Ciao Rob, ho inserito questa riga subito dopo "RewriteBase /" e ora visualizzo "Errore 500 - Errore interno del server"
Kelvin,

@Kelvin Ho modificato la mia risposta, aggiungi la condizione prima di ogni regola a cui desideri applicare.
Rob,

Questo è stato l'unico che mi ha davvero aiutato. La risposta accettata non mi ha aiutato.
Uwe Keim

5

Se si desidera rimuovere una determinata directory dalla regola (ovvero, si desidera rimuovere la directory foo ), è possibile utilizzare:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/foo/$
RewriteRule !index\.php$ /index.php [L]

La regola di riscrittura sopra riscriverà tutte le richieste in /index.php escludendo le richieste per / foo / .

Per escludere tutti i registri esistenti, è necessario utilizzare la seguente condizione sopra la regola:

RewriteCond %{REQUEST_FILENAME} !-d

la seguente regola

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !index\.php$ /index.php [L]

riscrive tutto (tranne i registri) in /index.php .


5

Abbiamo usato la seguente regola mod_rewrite:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/test/
RewriteCond %{REQUEST_URI} !^/my-folder/
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Questo reindirizza (permanentemente con un reindirizzamento 301) tutto il traffico al sito verso http://www.newdomain.com , tranne le richieste alle risorse nelle directory / test e / my-folder. Trasferiamo l'utente all'esatta risorsa richiesta utilizzando il gruppo di acquisizione (. *) E includendo quindi $ 1 nel nuovo URL. Fai attenzione agli spazi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.