O jeito que eu faço:
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule (.*) $1.html [L]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.htm -f
RewriteRule (.*) $1.htm [L]
RewriteCond %{REQUEST_URI} !(\.[^./]+)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]
Cada uma das sub-rotinas tem a seguinte lógica:
-
Se o arquivo solicitado não tiver uma extensão, ou seja, ele não corresponderá a
\.[^./]+)$
, e -
O arquivo solicitado não é um diretório, e
-
O arquivo solicitado não existe, e
-
Existe um arquivo com o nome solicitado e a extensão
.html
(ou.htm
, ou.php
), então -
Sirva esse arquivo.
O [L]
significa o último ou o final: não é preciso mais reescrever, então o servidor pode pular com segurança o resto das regras de reescrita.