Remova ‘index.php’ da URL com .htaccess

Eu tenho tentado todos os tipos de soluções deste site e nenhum parece funcionar. Atualmente estou hospedando com hostgator. Este é o meu arquivo .htaccess atual:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L]   suPHP_ConfigPath /home/user/php.ini  order allow,deny deny from all   

Esta é a pasta raiz do meu site. Eu também tentei adicionar um ? depois de index.php e sem sorte. Alguém sabe por que isso não está funcionando?

Este é o código que você pode usar no seu .htaccess (sob DOCUMENT_ROOT) para remover index.php do URI:

 Options +FollowSymLinks -MultiViews # Turn mod_rewrite on RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?$1 [L,QSA] RewriteCond %{THE_REQUEST} ^[AZ]{3,}\s(.*)/index\.php [NC] RewriteRule ^ %1 [R=301,L] 

O Symfony 2 tem uma excelente solução:

 RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ RewriteRule ^(.*) - [E=BASE:%1] # Sets the HTTP_AUTHORIZATION header removed by apache RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] RewriteCond %{REQUEST_FILENAME} -f RewriteRule .? - [L] RewriteRule .? %{ENV:BASE}/index.php [L] 

Isso realiza o seguinte:

  • RewriteBase não é necessário (útil quando o site está em um subdiretório abaixo da raiz da web)
  • index.php é removido se presente
  • A solicitação é roteada para o index.php correto com a string de consulta completa da solicitação original

Note que a linha:

 RewriteRule ^(.*) - [E=BASE:%1] 

é responsável por definir a variável %{ENV:BASE} para mais tarde. Consulte a documentação do Apache no flag E|env .

Eu tentei isso e funciona bem:

  RewriteEngine On RewriteBase / # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] # Directs all EE web requests through the site index file RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L]  

Exceções

Se o diretório do sistema do seu site (/ system /) tiver sido renomeado e ainda estiver acessível por URL, modifique a linha RewriteCond acima:

 RewriteCond %{REQUEST_URI} !/newdirectoryname/.* [NC] 

Se você estiver executando o EE de um subdiretório em vez da raiz do seu domínio (por exemplo, http://example.com/myeesite/ em vez de http://example.com/ ), basta remover a barra que precede o index.php em a linha RewriteRule acima, assim:

 RewriteRule ^(.*)$ index.php/$1 [L] 

Se você estiver executando o EE de um subdiretório e ele ainda não funcionar após a remoção da barra, talvez seja necessário especificar o subdiretório em sua regra de reconfiguração. Por exemplo, se sua subpasta tiver o nome de teste, altere:

 RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Para:

 RewriteRule (.*?)index\.php/*(.*) testing/$1$2 [R=301,NE,L] 

E mude:

 RewriteRule ^(.*)$ /index.php/$1 [L] 

Para:

 RewriteRule ^(.*)$ testing/index.php/$1 [L] If your host requires forcing query strings, try adding a question mark following index.php in the RewriteRule line above, like so: RewriteRule ^(.*)$ /index.php?/$1 [L] 

Resposta Atualizada

Atualmente, eu uso apenas o WordPress .htaccess como base: é relativamente simples e funciona como esperado:

  RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  

Também é simples forçar https:// se você desejar:

  RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule (.*) https://%{HTTP_HOST} [L,R=301] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L]  

Post original de 2012

Minha sugestão inicial era primeiro fazer um redirecionamento rápido (para remover index.php ) e depois um redirecionamento interno de volta para index.php .

O problema é que uma correspondência de redirecionamento interno voraz (por exemplo, usando (.*) ) Parece acionar o redirecionamento rígido novamente, levando a um loop de redirecionamento infinito.

Eu sinto que há uma solução mais elegante do que eu estou prestes a sugerir, mas infelizmente eu não tenho o know-how do Apache para pensar nisso.

O que eu faria é ter um RewriteRule que executa um redirecionamento direto para remover o index.php e, em seguida, um conjunto de regras de redirecionamento interno para executá-lo a partir daí. Por exemplo:

  RewriteEngine On RewriteRule ^index\.php(.*)$ /$1 [R,L,QSA] RewriteRule ^pie$ /index.php?pie [L,QSA]  

Isso parece funcionar corretamente sem produzir nenhum erro 500. Mas, novamente, recomendo uma pitada de sal.

Embora esteja muito longe de uma boa solução, espero que ajude.

Fui obrigado a participar do stack overflow.com hoje para comentar aqui, pois a resposta resolveu um problema de longo prazo que tive com um site do Zend Framework. Eu trabalhei no site em torno de 3 1/2 anos e durante esse tempo eu descobri que ele não manipulou index.php corretamente e isso faz com que as ferramentas do webmaster ver títulos duplicados etc.

Eu decidi procurar novamente hoje por uma solução, uma das muitas tentativas.

Este é o único (a última resposta mostrada acima) que resolve o meu problema.

  # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Como um exemplo. isso é o que alcança para mim.

http://www.domainname.co.uk/index.php/categories/url-name.html

torna-se

http://www.domainname.co.uk/categories/url-name.html

Obrigado a todos que contribuíram para a pergunta original, pois ela levou à resposta e à solução acima.

Nota extra: Eu tenho outros comandos de reescrita que lida com os outros aspectos, mas que por si só não corrigiram o index.php e a única vez que isso foi corrigido é usando.

 # Removes index.php from ExpressionEngine URLs RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteCond %{REQUEST_URI} !/system/.* [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,NE,L] 

Eu só espero que ajude os outros, seja o ExpressionEngine ou o Zend Framework, no futuro.

Para remover index.php de urls no apache2.4, você pode usar a seguinte regra:

  RewriteEngine on RewriteRule ^index\.php/(.+)$ /$1 [L,R] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !index\.php /index.php%{REQUEST_URI} [L,END] 

Isso vai mudar o uri

 /index.php/foobar 

para

 /foobar 

Esta regra retornará um erro interno do servidor para versões inferiores do apache, pois elas não suportam o sinalizador END . Por favor, veja a resposta do anubhava acima que funciona quase em todas as versões.