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
- RewriteEngine on
- RewriteCond $1 !^(index\.php|images|robots\.txt)
- 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:
- RewriteEngine on
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- 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:
- 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. - 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:
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.