2012-10-12 15 views
8

La mia pagina non sta riorientando come dovrebbe a causa di mio file .htaccess che è impostato come:eccezione mod_rewrite per un file specifico

RewriteEngine on 
RewriteCond $1 !^(index\.php|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

Io uso questa configurazione per il mio framework MVC in modo da ottenere gli URL come /controller/method/argument tuttavia quando reindirizzo a /forum/login.php taglia in/forum /.

Come posso aggiungere questo come eccezione in modo che sarò in grado di reindirizzare a /forum/login.php

ho trovato un altro .htaccess nella mia/forum/directory potrebbe questo essere la causa del problema pure?

# BEGIN PunBB 

<IfModule mod_rewrite.c> 
    # MultiViews interfers with proper rewriting 
    Options -MultiViews 

    RewriteEngine On 

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly 
    #RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . rewrite.php [L] 
</IfModule> 

risposta

21

Prima ti dirò come leggere il vostro RewriteRule:

Si inizia con la prima (o successivo) RewriteRule entry:

RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Il primo parametro è un'espressione regolare che può corrispondere all'URL richiesto. ^(.*)$ corrisponde a tutto e memorizza questo "tutto" all'interno di una variabile che può essere utilizzata in seguito.

Solo se vi sono precedenti voci RewriteCond, vengono valutati seguente:

RewriteCond $1 !^(index\.php|resources|robots\.txt)

$1 è un riferimento al contenuto corrispondente all'interno delle prime parentesi RewriteRule. Questo viene confrontato con il secondo parametro, che è un'espressione regolare che indica diversi nomi espliciti e ! nega l'espressione, ad es. questa regola consente l'esecuzione di RewriteRule solo se la regex non corrisponde. Se questa condizione restituisce true, verrà esaminata la condizione successiva.

RewriteCond %{REQUEST_FILENAME} !-f

Se il nome del file richiesto non è vero file sul disco rigido, questa condizione è vero.

RewriteCond %{REQUEST_FILENAME} !-d

Se il nome del file richiesto non è directory reale, questa condizione è vero.

Solo se tutte queste condizioni sono vere (che sono incatenati insieme a E), torniamo alla regola di riscrittura:

RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Il risultato di questa fase di riscrittura è definito come il secondo e il terzo parametro. $1 viene utilizzato nuovamente come il contenuto della corrispondenza e i parametri definiscono che questa regola, se inizialmente associata, sarà l'ultima regola (L) e che qualsiasi stringa di query definita nella destinazione di riscrittura verrà aggiunta a qualsiasi stringa di query nell'URL originale (QSA).

Critica:

Il solito riscrittura per framework MVC cercare di essere il più performante possibile. Le tue condizioni di riscrittura devono essere tutte valutate per una riscrittura riuscita. Si interromperà solo se uno dei RewriteCond restituisce false. Ogni richiesta che viene riscritta è soggetta a numerosi test intensivi della CPU. Prima la reindirizzamento di RewriteRule, quindi l'espressione regolare nel primo RewriteCond, seguita da due test del disco rigido sul filesystem per l'esistenza dei file.

D'altra parte, il primo RewriteCond sembra non essere necessario. Verifica determinati nomi e, se trovato, interrompe la riscrittura. "index.php" dovrebbe essere rilevato dal secondo RewriteCond, perché è un file esistente (come funzionerebbe la riscrittura se non lo fosse). Tutto ciò che inizia con "risorse" verrà eguagliato, ma probabilmente non dovrebbe per gli stessi motivi: le risorse esistenti verranno trovate dal secondo RewriteCond. Ultimo il file "robots.txt". È sempre una buona idea averne uno, possibilmente inaffidabile se vuoi evitare 404 quando i robot recuperano il tuo sito.

Poiché non si modifica nulla nella stringa di query, la direttiva [QSA] non è necessaria.

Miglioramenti:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [L] 
RewriteRule ^.*$ index.php [L] 

La prima RewriteRule corrisponderà l'intero percorso richiesto. I due RewriteCond sono connessi con [OR], quindi il primo RewriteCond che restituisce true annullerà un'ulteriore valutazione. Il primo RewriteCond verifica se il file richiesto esiste. Se esiste, restituisce true e l'elaborazione ritorna al primo RewriteRule. L'espressione di destinazione è "-", che significa "non riscrivere". [L] interrompe l'elaborazione delle regole di riscrittura. Quindi, alla fine, per un file esistente abbiamo solo una regex e un test del filesystem, e dopo questo, questo file esistente verrà inviato al browser.

Se non è stato trovato alcun file, il primo RewriteRule e RewriteCond non si attivano, quindi [L] non interromperà il processo. Quindi viene eseguito il secondo RewriteRule. Questo è incondizionato e la regex è la stessa di prima, facendo corrispondere tutto e riscrivendolo a "index.php".

Questa riscrittura non chiamerà index.php se esiste un qualsiasi file, incluso /forum/login.php.

È possibile modificare il secondo a RewriteRule ^.*$ index.php/$0 [L] se si desidera continuare l'analisi di $_SERVER['PATH_INFO'] anziché $_SERVER['REQUEST_URI'].

+0

Grazie! Ho cercato questo livello di spiegazione per mesi. – wallyk

+0

Correzione funziona ora. –

+2

Questo è così incredibilmente completo e ha bisogno di più credito di quello che è stato dato. –

2

prova con questo:

RewriteEngine on 
RewriteCond $1 !^(index\.php|forum|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

E questo:

# BEGIN PunBB 

# ---------------------------------------------------------------------- 
# Start rewrite engine 
# ---------------------------------------------------------------------- 

<IfModule mod_rewrite.c> 
    # MultiViews interfers with proper rewriting 
    Options -MultiViews 

    RewriteEngine On 

    # Uncomment and properly set the RewriteBase if the rewrite rules are not working properly 
    RewriteBase /forum/ 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule . rewrite.php [L] 
</IfModule> 


# ---------------------------------------------------------------------- 
# Better website experience for IE users 
# ---------------------------------------------------------------------- 

# Force the latest IE version, in various cases when it may fall back to IE7 mode 
# github.com/rails/rails/commit/123eb25#commitcomment-118920 
# Use ChromeFrame if it's installed for a better experience for the poor IE folk 

<IfModule mod_setenvif.c> 
    <IfModule mod_headers.c> 
     BrowserMatch MSIE ie 
     Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie 
    </IfModule> 
</IfModule> 

<IfModule mod_headers.c> 
    # Because X-UA-Compatible isn't sent to non-IE (to save header bytes), 
    # We need to inform proxies that content changes based on UA 
    Header append Vary User-Agent 
    # Cache control is set only if mod_headers is enabled, so that's unncessary to declare 
</IfModule> 


# ---------------------------------------------------------------------- 
# UTF-8 encoding 
# ---------------------------------------------------------------------- 

# Use UTF-8 encoding for anything served text/plain or text/html 
AddDefaultCharset utf-8 

# Force UTF-8 for a number of file formats 
AddCharset utf-8 .html .css .js .xml .json .rss 


# ---------------------------------------------------------------------- 
# A little more security 
# ---------------------------------------------------------------------- 

# Do we want to advertise the exact version number of Apache we're running? 
# Probably not. 
## This can only be enabled if used in httpd.conf - It will not work in .htaccess 
# ServerTokens Prod 


# "-Indexes" will have Apache block users from browsing folders without a default document 
# Usually you should leave this activated, because you shouldn't allow everybody to surf through 
# every folder on your server (which includes rather private places like CMS system folders). 
<IfModule mod_autoindex.c> 
    Options -Indexes 
</IfModule> 

# END PunBB 
+0

No, si sta ancora riducendo a/forum /. –

+0

Ho modificato il mio snippet di codice .. prova ora. –

+0

Non viene ancora tagliato, ho controllato tutti i file .htaccess nel mio server web. –