2013-06-14 15 views
8

Ho la seguente nel mio file .htaccess:RewriteRule la creazione di 500 Internal Server Error

Options +FollowSymLinks 
RewriteEngine on 
RewriteRule ^directory/(.*)$ directory/index.php?id=$1 

Quello che sto cercando di realizzare è questo:

Quando l'URL www.mydomain.com/directory/10 è visitato, la pagina www.mydomain.com/directory/?id=10 viene visualizzato sul browser senza alterare l'aspetto dell'URL.

Il codice precedente crea tuttavia un errore di server interno 500.

Qualcuno sa dove sto andando male?

+2

Un errore 500 significa in genere che un errore è stato registrato da qualche parte. Trova i tuoi log degli errori di Apache e PHP e vedi qual è l'errore reale. – IMSoP

+5

L'errore 500 inviato al browser avrebbe dovuto informare che il messaggio di errore completo sarebbe presente nei log del server. Leggili. – Quentin

risposta

16

Il codice è garantito per generare 500 errori interni del server perché causa un loop infinito. Il motivo è che il modello URI corrispondente è: ^directory/(.*)$

Quale corrisponde ai tuoi URL prima e dopo riscrive. E una volta raggiunto il massimo consentito, il limite di riscrittura interno Apache genera 500 errori interni del server e salta fuori.

modificare il codice per questo:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^directory/(.*)$ /directory/index.php?id=$1 [L,QSA,NC] 

Sopra codice ha un extra RewriteCond %{REQUEST_FILENAME} !-f che farà in modo di non consentire la successiva esecuzione di RewriteRule dopo la prima volta da quando /directory/index.php sarà un file valido.

+1

È fantastico! Grazie. – Tom

+0

Prego, felice che abbia funzionato. – anubhava

+1

Volevo solo aggiungere che non mi ero reso conto che anche la mia regola di riscrittura faceva riferimento a se stessa. L'aggiunta della condizione di riscrittura ha risolto il problema. Qualcosa di ovvio ma facile da trascurare. –

1

Si dovrebbe provare ad aggiungere una barra in avanti verso la parte anteriore:

RewriteRule ^/directory/(.*)$ directory/index.php?id=$1 

Sono stato preso fuori con che prima.

In alternativa utilizzare il RewriteLog e RewriteLogLevel per eseguire il debug, e guardare l'errore e di accesso log di Apache per ulteriori informazioni:

RewriteLogLevel 3 
RewriteLog ${APACHE_LOG_DIR}/rewrite.log 

che lascerà un file di log nella directory di log di Apache. Nel mio caso è /var/log/apache

+0

Bene, questo ha risolto l'errore del server, ma ora ottengo "L'URL/directory richiesto/10 non è stato trovato su questo server. Qualche idea? – Tom

+0

Bene, ora sembra che Rewrite non corrisponda. –

+0

Aggiungi un RewriteLog nel tuo vhost (non sono validi in .htaccess) per puntare al file di log che vuoi scrivere. Ho modificato la mia risposta con un esempio. –

9

Ho lo stesso problema e ho riscontrato che il modulo "riscrittura" non è ancora abilitato nel mio caso. Così ho bisogno di attivarlo e quindi riavviare il server apache:

  • Enable "riscrivere" modulo: sudo a2enmod riscrivere
  • Poi riavviare il server apache: sudo service apache2 restart

Speranza questo aiuterà chiunque.

+0

Impressionante ... questo era il problema per me .... –

0

Se si utilizza CodeIgniter e si verificano problemi di errore 500. Seguire la soluzione.

Quindi per eliminare il segmento "index.php" degli URL in CodeIgniter, devi fare 2 cose.Il primo è quello di modificare il file /system/application/config/config.php, la modifica del valore della politica index_page a vuoto:

$config['index_page'] = ''; 

Il secondo passo è quello di creare un file .htaccess

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ index.php/$1 [L] 

E il gioco è fatto! D'ora in poi, gli URL del tuo sito/sistema realizzati con CodeIgniter non avranno più il thread (chiamato "fastidioso" da alcuni) "index.php".

Problemi correlati