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

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)

  • Configurando o Apache, Tomcat, mod_jk e mod_rewrite paira atender o tomcat do nível superior
  • Apache proxy pass in nginx
  • Htaccess reescreva paira o file localizado acima de um nível
  • Por que dois padrões (/.*) e (. *) Combinam strings diferentes?
  • Apache2 mod_rewrite Clean URL - working, mas files não acessíveis
  • Apache 404 retornando 500 erros. Solicitair redirecionamentos excedidos
  • Por que algumas regras de reescrita crashm enquanto a AJP está atendendo todos os meus requests ao Tomcat?
  • Bloqueando um URL específico por IP (uma URL criada por mod-rewrite)