Como faço para escrever um arquivo .htaccess para fazer o trabalho de roteamento de URLs CodeIgniters?

Estou executando um ambiente LAMP com o CodeIgniter. Eu quero ser capaz de usar seu padrão de URL, como, http://localhost/controller/function/ID , mas por padrão tem que ser http://localhost/index.php/controller/function/ID . O guia do usuário diz que eu preciso de um arquivo .htaccess para tornar o estilo anterior possível e usa isso como um exemplo:

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

Mas eu não entendo como isso funciona. Onde devo colocar o .htaccess? Tem que estar na raiz do servidor?

E se eu tiver vários sites em execução no meu servidor? Eu tenho que colocá-lo em /var/www/ e especificar condições com base em quais diretórios são carregados? Ou posso simplesmente colocá-lo em /var/www/site_using_codeigniter/ ? Eu não tenho certeza de como fazer isso funcionar.

Posso fazer com que apenas mapeie para um URL do MVC se o URL solicitado não existir realmente? Por exemplo, http://localhost/articles/2009/some-article-name não seria um diretório no servidor, então seria index.php para index.php e seria dado a codeigniter, mas http://localhost/forum existiria no servidor, mas não deveria ser tratado pelo codeigniter.

Quaisquer outras coisas que eu deveria fazer com um arquivo .htaccess? Algo bom para ler sobre eles?

atualizar

Eu mudei meu arquivo de configuração assim:

 $config['index_page'] = ""; //used to be "index.php" 

e adicionei isso a um arquivo .htaccess :

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

e salvei no diretório raiz do meu site (neste caso /var/www/cms/ )

Eu entrei no /etc/apache2/conf.d/security (que está incluído no /etc/apache2/apache2.conf) e fiz isso:

  AllowOverride All #was "none", but this was all commented out Order Deny,Allow Deny from all  

Ainda não está funcionando no entanto. Se eu navegar para http://localhost/cms/index.php/hello , ele imprime “Hello there”, mas http://localhost/cms/hello fornece um erro 404.

Idéias?

atualização: greta sucesso!

Eu tive que cavar através de meus arquivos de configuração do Apache para finalmente encontrar onde todos os diretórios foram definidos (eu nunca tinha mexido nos arquivos de configuração do servidor antes desta data) e encontrei aquele irritante AllowOverride None que estava frustrando meus planos de grandeza.

Agora funciona perfeitamente. Todas as respostas aqui são viáveis ​​e funcionam.

No seu system/application/config/config.php , altere

 $config['index_page'] = "index.php"; 

para

 $config['index_page'] = ""; 

e no seu .htaccess , adicione isto:

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

Adicione seu arquivo .htaccess ao mesmo diretório onde a pasta do system está localizada, portanto, no seu diretório raiz do CodeIgniter, você deve ter

  • sistema/
  • guia de usuario/
  • index.php
  • .htaccess
  • license.txt

Além disso, como você tem vários sites em execução no servidor, convém usar o VirtualHosts. Adicione isto na última parte do seu apache2.conf para cada site que você tem:

 Listen *:11000  ServerAdmin you@somewhere.com DocumentRoot "/var/www/cms" ServerName you-dummy.com  AllowOverride All Options +Indexes DirectoryIndex index.php Order allow,deny Allow from all  ErrorLog logs/cms_log CustomLog logs/cms_log common  

Agora você pode acessar o site a partir de http://localhost:11000/ e acessar o controlador usando http://localhost:11000/hello .

Tentei a resposta aqui, mas isso não funcionou para mim. Então eu tentei o seguinte e fez …

crie o .htaccess no diretório raiz onde o index.php, juntamente com o license.txt, está disponível. insira o seguinte código no arquivo e armazene-o:

 DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 

feito! tente e certamente funcionará. Espero que ajude

Tive alguns problemas em encontrar onde alterar o “AllowOverRide All”.

Neste guia , encontrei o arquivo (padrão).

Remover Index.php URL do CodeIgniter no Ubuntu

  1. Nota Prévia. Estou executando todas as etapas deste tutorial com privilégios de root, portanto, verifique se você está logado como root:

     sudo su 
  2. Ative o módulo mod_rewrite no apache. Primeiro, ative o módulo da seguinte maneira:

     a2enmod rewrite 

    Altere toda a ocorrência de “AllowOverRide None” para “AllowOverRide All”. Basicamente tudo “None” para “All” no seguinte arquivo:

      gedit **/etc/apache2/sites-available/default** 

    Reinicie o Apache:

     /etc/init.d/apache2 restart 
  3. Abra o arquivo config.php no CodeIgniter (application \ config). Remova index.php em $config['index_page'] = "index.php";

     $config['index_page'] = ""; 
  4. Faça o arquivo .htaccess no diretório raiz do CodeIgniter. Preencha o arquivo com este código:

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

Agora Index.php na URL do CodeIgniter desaparece

Este arquivo .htaccess em particular parece que precisa ir na raiz do seu site (ou seja, o site atualmente em execução.)

Examine a documentação do RewriteCond para saber quais outros tipos de condições você pode especificar. Basicamente, um RewriteRule só será aplicado se todos os seus RewriteCond anteriores forem correspondidos. Você poderia tentar adicionar essas regras para redirect somente se o URL solicitado não existir:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d 

O mod_rewrite é muito poderoso, mas pode ser uma dor real se não estiver fazendo o que você acha que deveria. Eu não sei de nenhuma maneira de depurar suas diretivas, também.

Quanto ao que mais você pode fazer com um arquivo .htaccess, os documentos do Apache para arquivos htaccess são sempre um bom lugar para começar. O uso mais comum é para autenticação por diretório. A maioria das diretivas de configuração do servidor é suportada em um arquivo .htaccess (desde que o servidor AllowOverride diga isso), mas algumas têm syntax diferente.

Coloque isso na raiz do documento do seu site.

Se você tiver vários sites, coloque-os no topo de cada um desses sites.

Se você tiver vários sites em execução no mesmo diretório, poderá usar um RewriteCond para excluir ou include sites específicos na regra de reconfiguração.

Você pode excluir certos diretórios (por exemplo, / artigos) da mesma maneira.

Eu tive os mesmos problemas com imagens de links do CodeIgnitor, js, css. Tudo funciona agora graças a vocês! Eu segui os passos abaixo. consolidou todos os outros comentários no meu cenário para trabalhar. Espero que isso ajude alguém.

  1. mudou o httpd.conf

      AllowOverride All #was "none", but this was all commented out Order Deny,Allow Deny from all  
  2. criou um arquivo .htaccess vazio no diretório htdocs \ yoursite (raiz do site) e colou o seguinte.

     DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 

Experimente este, ele funciona perfeitamente

 DirectoryIndex index.php RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 
  RewriteEngine on RewriteBase / # Removes the "/" at the end RewriteRule (.+)/$ /$1 [L,R] RewriteCond $1 !^(index\.php|dhtml|img|css|js|favicon\.ico|robots\.txt) RewriteRule ^([^?&]+) /index.php/$1 [L]  
 RewriteEngine on RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) RewriteRule ^(.*)$ ./index.php/$1 [L,QSA] 

O simples em .htaccess na pasta raiz! Funciona para mim.