Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I write a .htaccess file to make CodeIgniters URL routing work?

I'm running a LAMP environment with CodeIgniter. I want to be able to use its URL pattern, like, http://localhost/controller/function/ID, but by default it has to be http://localhost/index.php/controller/function/ID. The user guide says that I need a .htaccess file to make the former style possible, and uses this as an example:

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

But I don't understand how this works. Where should I put the .htaccess? Does it have to be in the server root?

What if I have multiple sites running on my server. Do I have to put it in /var/www/ and specify conditions based on what directories are loaded? Or can I just put it in /var/www/site_using_codeigniter/? I'm not sure how to even get this to work.

Can I make it so that it will only map to an MVC URL if the requested URL doesn't actually exist? For example, http://localhost/articles/2009/some-article-name wouldn't be a directory on the server, so it would map to index.php and be given to codeigniter, but http://localhost/forum would exist on the server but shouldn't be handled by codeigniter.

Any other things I should do with a .htaccess file? Anything good to read about them?

update

I changed my config file like this:

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

and added this to a .htaccess file:

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

and saved it in my sites root directory (in this case /var/www/cms/)

I went into /etc/apache2/conf.d/security (which is included by /etc/apache2/apache2.conf) and did this:

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

It's still not working however. If I navigate to http://localhost/cms/index.php/hello, it prints "Hello there," but http://localhost/cms/hello gives a 404 error.

Ideas?

update: græt success!

I had to dig through my apache configuration files to finally find where all the directories were defined (I had never messed around in server config files before this date) and found that pesky AllowOverride None that was foiling my plans for greatness.

Now it works perfectly. All of the answers here are viable and work.

like image 746
Carson Myers Avatar asked Sep 09 '09 00:09

Carson Myers


People also ask

Where do I put htaccess file in CodeIgniter?

You should place your . htaccess file at your root directory not Inside the application folder. Show activity on this post. Go to application/config/config.

What is the basic CodeIgniter URL structure?

Basic URL structureclass represents controller class that needs to be invoked. function is the method that is called. ID is any additional segment that is passed to controllers.

Where is Route file in CodeIgniter?

The file is located at application/config/routes. php(you already knew that). You will find an array called $route in which you can customize your routing rules.


3 Answers

In your system/application/config/config.php, change

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

to

$config['index_page'] = "";

and in your .htaccess, add this:

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

Add your .htaccess file to the same directory where the system folder is located, so in your CodeIgniter root directory, you should have

  • system/
  • user_guide/
  • index.php
  • .htaccess
  • license.txt

Also, since you have multiple sites running on your server, you might want to have VirtualHosts. Add this to the last part your apache2.conf for each site that you have:

Listen *:11000
<VirtualHost *:11000>
     ServerAdmin [email protected]
     DocumentRoot "/var/www/cms"
     ServerName you-dummy.com
     <Directory "/var/www/cms">
          AllowOverride All
          Options +Indexes
          DirectoryIndex index.php
          Order allow,deny
          Allow from all
     </Directory>
     ErrorLog logs/cms_log
     CustomLog logs/cms_log common
</VirtualHost>

You may now access the site from http://localhost:11000/ and access the controller using http://localhost:11000/hello.

like image 153
Randell Avatar answered Sep 18 '22 15:09

Randell


Tried the answer here but that didn't work for me. So i tried the following and it did...

create the .htaccess in the root directory where the index.php along with license.txt is available. enter the following code in the file and store it:

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]  

done! try it and it will surely work. Hope it helps

like image 28
sys_debug Avatar answered Sep 20 '22 15:09

sys_debug


Had some problems with finding where to change the "AllowOverRide All".

From this guide I found the (default) file.

Remove Index.php CodeIgniter URL On Ubuntu

  1. Preliminary Note. I'm running all the steps in this tutorial with root privileges, so make sure you're logged in as root:

    sudo su
    
  2. Enable mod_rewrite module on apache. First enable the module as follows:

    a2enmod rewrite
    

    Change all occurrence of "AllowOverRide None" to "AllowOverRide All". Basically all "None" to "All" in the following file:

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

    Restart Apache:

    /etc/init.d/apache2 restart
    
  3. Open file config.php on CodeIgniter (application\config). Remove index.php on $config['index_page'] = "index.php";

    $config['index_page'] = "";
    
  4. Make file .htaccess on CodeIgniter root directory. Fill the file with this code :

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

Now Index.php on CodeIgniter URL disappear

like image 41
The Demz Avatar answered Sep 17 '22 15:09

The Demz