Removendo o index.php da URL

Olá pessoal! Esse é meu primeiro artigo sobre Code Igniter, portanto, relevem na didática ou estrutura do mesmo. =)

Esse artigo pretende mostrar como remover o index.php do endereço do site e mostrar os possíveis problemas encontrados, permitindo que a URL se torne mais amigável e elegante. Consideramos que o site já esteja devidamente configurado, a base_url no arquivo config.php e as váriaveis $system_folder e $application_folder.

Criando o .htaccess
Inicialmente, precisaremos criar um arquivo chamado .htaccess. Para isso, basta abrir o bloco de notas, salvar como, e no campo "Salvar como tipo:" escolher a opção "Todos os arquivos". Informe o nome do arquivo como .htaccess

A documentação do Code Igniter disponibiliza uma regra para remover o index.php

  1. RewriteEngine on
  2. RewriteCond $1 !^(index\.php|images|robots\.txt)
  3. RewriteRule ^(.*)$ /index.php/$1 [L]

O problema dessa regra, é que cada vez que uma nova pasta é criada no servidor, necessita ser adicionada na segunda linha, como exceção à regra. Haja trabalho!

Assim, com a contribuição da comunidade, chegou-se à seguinte regra:

  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_FILENAME} !-d
  4. RewriteRule ^(.*)$ index.php/$1 [L]

Ou seja, se não exista o arquivo ou pasta fisicamente no servidor, ele redireciona para o Code Igniter. Assim, não precisaremos modificar o arquivo a cada vez que criarmos diretórios no host.

Configurando o Code Igniter
Para configurar o code igniter, acesse o arquivo config.php e altere a variável

$config['index_page'] = "";

Isso permitirá que ao utilizar a função site_url('exemplo/teste'), por exemplo, ele mostra a index_page em branco. Assim, a url aparecerá algo do tipo:

http://www.teste.com.br/exemplo/teste

Problemas encontrados
Aqui relatarei alguns parâmetros que precisam ser observado para que funciona perfeitamente. Em caso de erro, verifique os seguintes itens:

  1. Verifique se o mod_rewrite do apache está habilitado
    Em caso de utilização do servidor ISS, recomendo o artigo URL Rewriting: no IIS com ASP, ASP.NET ou PHP publicado no iMasters.
  2. Caso aconteça de ao clicar em qualquer página interna, e sempre exibir a home, tente alterar o parâmetro $config['uri_protocol'] do arquivo config.php. Já tive problemas com isso, e apenas funcionou ao definir como REQUEST_URI

Caso tenha tido algum outro problema, relate no comentário, juntamente com a solução, para atualizarmos a lista de possíveis erros.

Links relacionados:
http://codeigniter.com/wiki/mod_rewrite/ (Inglês)

Até a próxima!

Vinicius Cruz
http://www.viniciuscruz.com/

É possivel colocar as path de forma hierarquica?

Pessoal estou com um problema em relacao a linha:

  1. RewriteCond $1 !^(index\.php|images|robots\.txt)

Imaginemos que eu tenha uma estrutura do tipo pasta1/pasta1_1/pasta1_1_1
No RewriteCond teria como eu apenas verificar a existencia da pasta1_1_1 ? Hoje so consigo ter acesso a pasta1_1_1 se eu colocar a pasta1.
Abraços

Removendo o index.php

Muito bom o artigo porém, em um servidor compartilhado - particularmente no dreamhost - simplesmente não funciona - perdi horas tentando resolver até achar um artigo semelhante - não era nem sobre o CI, mas funcionou.

Meu .htacces:
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

Percebam a pequena mudança - a interrogação depois do index.php

Além disso, no meu caso, tive que alterar o config para isto $config['uri_protocol'] = "REQUEST_URI";

O AUTO simplemente não funciona - detalhe - trabalho num aempreas onde temos uma conta no dreamhost - shared host - com uma porrada de domínios lá.

Até mais

Ronaldo Junior

não recomendo a alternativa REQUEST_FILENAME

Olá vinicios cruz, eu testei suas regras para o .htaccess, porem ao utilizar as regras RewriteCond %{REQUEST_FILENAME} !-f e RewriteCond %{REQUEST_FILENAME} !-d vi que é possivel acessar todos os arquivos e pastas do CI atraves do browser

Exemplo: para o site www.comocriarsites.com.br a pessoa pode digitar no navegador www.comocriarsites.com.br/system/scaffolding/views/view.php e ter acesso a arquivos e pastas que normalmente não deveria ser acessado via url.

Claro que se pode alterar a estrutura de pastas do CI, colocando o core em um nivel de diretorio não acessivel via http, bem, mas fica a dica: se não for alterar a estrutura de pastas não abra mão das regras .htaccess que esta no manual do CI, pois colocar as exceções RewriteCond $1 !^(index\.php|images|robots\.txt|css|js) não é nenhum incomodo posto que normalmente se faz uma vez só.

NatanaelFreire.com

Não consegui..

Aqui da erro, não encontra a pagina se tiro o index.php...

Alterando o $config['uri_protocol']

@Banzayii e @reinalds,

tente alterar a configuração do URI_PROTOCOL localizado no arquivo config/config.php, para uma outra opção. O Eric, da comunidade, já resolveu o problema de página não encontrada alterando para PATH_INFO. Verifique as outras opção, relatadas no próprio arquivo de config.php

---
Vinicius Cruz
http://www.viniciuscruz.com

404 ainda

testei as opções do URI_PROTOCOL e continua o mesmo erro....utilizo o APACHE no windows XP , existe outra configuração a ser feita no apache alem de descomentar a linha do mod_rewrite?

Re: 4004 ainda

Banzayii, eu estou usando o valor ORIG_PATH_INFO na opção uri_protocol do config.php e deu certo.

NatanaelFreire.com

Dúvida

Só tenho uma dúvida onde devo colocar o arquivo .htaccess?
Fora isso, o se tuto esta muito bom.

Local do arquivo .htaccess

reinalds,
O arquivo .htaccess deve ser colocado na raiz do site. Pode ter como referência, o endereço do base_url (localizado no arquivo config.php)

Esqueci desse detalhe no artigo. =)

---
Vinicius Cruz
http://www.viniciuscruz.com

Duvida

Vinicius obrigado pela resposta,

Mas mesmo colocando o arquivo .htaccess no diretório raiz do projeto ainda não consigo acessar minhas páginas sem utilizar o index.php na URL.

Obs.: Segui o tutorial e habilitei o mod_rewrite no server.