Como foi respondido por Brian acima:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php [R=301]
Como sugerido por Chris acima:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php [R=307]
Se você está tentando fazer um redirecionamento interno, onde o URL não é reescrito no navegador:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php
O método de Brian fará um redirecionamento 301. Isso dirá a qualquer mecanismo de pesquisa / navegador / cache que o conteúdo foi movido permanentemente, o URL existente desapareceu e não deve ser usado. O método de Chris fará um redirecionamento 307. 307 é o equivalente HTTP / 1.1 de um redirecionamento temporário. Ambos irão reescrever a URL no navegador, ambos terão o efeito da pessoa indo para o site, clicando nessa URL e sendo redirecionado para a nova url de foo.com/index.php. O último método fará a reescrita da url internamente para que a URL no navegador permaneça foo.com/contact em vez de foo.com/index.php
Nenhuma das regras realmente passa nenhum parâmetro para index.php, portanto, o 301 & Redirecionamentos 307, na verdade, perderiam o restante da URL. Se você estiver usando os redirecionamentos 301/307 para redirecionar tudo para uma página de entrada, esse comportamento pode ser aceitável. Se essa for sua intenção, sugiro usar:
ErrorDocument 404 /index.php
e, em seguida, verifique se todas as imagens / links estão relativamente / absolutamente vinculados nessa página ou se você usa um para garantir que os URLs sejam reescritos corretamente na página resultante.
Se você quiser passar o URI solicitado para index.php como um parâmetro para análise:
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ /index.php?page=$1
Nesse caso, $ _REQUEST ['page'] conteria / contact de foo.com/contact