Tips / Apache
Apache appende automaticamente l'estensione ai file
Author: Tafaz
Visits: 1460
Date: 15.11.2008
Negli scorsi giorni sono incappato in questo "strano" comportamento di apache (che poi vedremo che così strano non è). In poche parole stavo facendo un sito con i rewrite per gli url quando mi sono trovato che se chiamavo un'URL con il nome di un file esistente ma senza estensione apache automaticamente mi aggiungeva l'estensione .php e non eseguiva il rewrite.
Il rewrite è così strutturato
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} !(\.php)
RewriteRule (.*) index.php?r=$1&%{QUERY_STRING}
in poche parole s l'URL richiesto non è un file esistente o non è una directory esistente invia la richiesta a index.php passando come parametro r la URI richiesta e appende ogni eventuale query string. In questo modo anzichè avere molte righe di rewrite demando il compito di gestire i rewrite al file index.php, Il problema si verifica quando chiamo ad esempio http://miosito.com/info/ e nella webroot di miosito.com esiste un file chiamato info.php, info.html, ecc apache anzichè passare tutto allo script index.php mi visualizzava il file info.php.
Dopo qualche ora di scervellamento nei vari moduli di apache ho trovato che è l'opzione MultiViews che fa comportare Apache in questo modo in quanto se viene richiesto un path che nel server non esiste es. /some/dir/foo e foo non esiste e la directory /some/dir ha MultiViews abilitato Apache cerca nella directory i files chiamati foo.* e se ne trova uno lo serve all'utente.
MultiViews è un'opzione di apache per-directory e può quindi esser modificata sia dal file di configurazione di apache sia da .htaccess in qualsiasi di queste sezioni <Directory>, <Location> or <Files>.
nel mio caso è bastato quindi modificare il file di configurazione di apache mettendo
<Directory /var/www>
Options -MultiViews
</Directory>
e riavviare apache
Author: Tafaz
Visits: 1460
Date: 15.11.2008
Il rewrite è così strutturato
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} !(\.php)
RewriteRule (.*) index.php?r=$1&%{QUERY_STRING}
in poche parole s l'URL richiesto non è un file esistente o non è una directory esistente invia la richiesta a index.php passando come parametro r la URI richiesta e appende ogni eventuale query string. In questo modo anzichè avere molte righe di rewrite demando il compito di gestire i rewrite al file index.php, Il problema si verifica quando chiamo ad esempio http://miosito.com/info/ e nella webroot di miosito.com esiste un file chiamato info.php, info.html, ecc apache anzichè passare tutto allo script index.php mi visualizzava il file info.php.
Dopo qualche ora di scervellamento nei vari moduli di apache ho trovato che è l'opzione MultiViews che fa comportare Apache in questo modo in quanto se viene richiesto un path che nel server non esiste es. /some/dir/foo e foo non esiste e la directory /some/dir ha MultiViews abilitato Apache cerca nella directory i files chiamati foo.* e se ne trova uno lo serve all'utente.
MultiViews è un'opzione di apache per-directory e può quindi esser modificata sia dal file di configurazione di apache sia da .htaccess in qualsiasi di queste sezioni <Directory>, <Location> or <Files>.
nel mio caso è bastato quindi modificare il file di configurazione di apache mettendo
<Directory /var/www>
Options -MultiViews
</Directory>
e riavviare apache
Aggiornamento del 30/03/2010
sugli hosting linux aruba se usate i mod_rewrite con le seguenti regole
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-d
e usate rewrite che puntano a file esistenti (esempio www.sito.com/contatti/ che punta a www.sito.com/contatti.php) ricordatevi nel file .htaccess di aggiungere Options -MultiViews ... ci ho perso quasi 2 ore oggi
Page 1 of 1
Se vuoi discutere con noi su questo articolo o comunque vuoi porci delle domande usa il nostro Forum

