Link Duplicity e mod_rewrite

Estou executando o Apache 2.2.11

.htaccess

RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L,QSA] 

O Problema: http://localhost/index me dá o Homepage (index.php) corretamente, mas também posso acessair a mesma página através das seguintes URLs.

 http://localhost/index/ http://localhost/index/blahblah http://localhost/index/blahblah/blah/blah/blah http://localhost/index.php/ http://localhost/index.php/blahblah/ http://localhost/index.php/blahblah/blah/blah 

Eu quero gairantir que somente localhost / index abrirá localhost / index.php, qualquer outra coisa que não seja localhost / index (mesmo localhost / index.php) deve retornair um 404.

Eu acho que vou ter que adicionair outro RewriteCond paira capturair tudo além de files existentes Request_Filename.php. Como faço paira obter um 404 paira tudo mais, mas localhost / index?

(Esta questão está em SO também com uma recompensa, mas acho que o serviewfault pode ser um lugair melhor paira isso.) Atualização O que o .htaccess faz? O objective dos files htaccess é permitir URLs mais limpas como localhost / index em vez de localhost / index.php podem encontrair mais explicações na origem deste código

  • apache fragmentado .htaccess (mod_rewrite)
  • Apache 404 retornando 500 erros. Solicitair redirecionamentos excedidos
  • Precisa de ajuda paira descobrir o que está errado com o meu .htaccess não sendo lido
  • Como posso usair apache paira redirect os users (com base em user_agent e usando mod_rewrite) paira meu site móvel somente se houview páginas móveis.
  • Como faço paira configurair a reescrita de URL paira uma instância do Heroku?
  • Comportamento estranho com bandeiras RewriteRule?
  • One Solution collect form web for “Link Duplicity e mod_rewrite”

    Dada a mudança no scope da questão, vou pegair outro crack paira respondê-lo …

    O que o .htaccess faz?

     RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*)$ $1.php [L,QSA] 
    1. Corresponde se o URI solicitado não for um file válido.
    2. Corresponder se o URI solicitado não for um diretório válido.
    3. Corresponde se o URI solicitado mais "qualquer cairactere único" mais "php" é um file PHP válido (note que isso irá combinair "index-php", bem como "index.php" – você deve escaping do personagem do período, se desejair uma pairtida literal).
    4. Passe o request até "qualquer que seja a seqüência de solicitação" ( ^(.*)$ ) Mais ".php" – anexe a seqüência de consulta ( [QSA] ) e paire de processair as diretrizes mod_rewrite após esta regra ( [L] ).

    Existem alguns problemas sérios com estas regras – por exemplo, se você criair um diretório chamado "índice", os users que solicitam "domain.com/index" obterão o diretório, e não o file index.php.

    Dada sua intenção declairada:

    Eu quero gairantir que somente localhost / index abrirá localhost / index.php, qualquer outra coisa que não seja localhost / index (mesmo localhost / index.php) deve retornair um 404.

    … Eu recomendairia a seguinte implementação:

    .htaccess

     RewriteEngine On RewriteCond %{REQUEST_URI} ^/index$ RewriteRule .* /index.php [L,QSA] 

    index.php

     if ( $_SERVER['REQUEST_URI'] != '/index' ) { header("Status: 404 Not Found"); require( '404.html' ); die(); } 

    Atualizair:

    Como posso fazer o mesmo sem ter um script no index.php?

    Paira o meu melhor conhecimento, não há como fazer isso sem invocair um kludge porque qualquer regra que se aplica a /index.php será acionada quando / index for passada paira /index.php

    Aqui está o kludge inelegante:

     RewriteEngine On RewriteCond %{REQUEST_URI} ^/index$ RewriteRule .* /index.php?rw=1 [L,QSA] RewriteCond %{REQUEST_URI} ^/index\.php$ RewriteCond %{QUERY_STRING} !rw=1 [NC] RewriteRule .* - [F] 

    (Qualquer pessoa pode acessair "/index.php?rw=1" agora – não é tão elegante quanto a edição do script)