Search engine and user friendly CodeIgniter URLs

<p class="MsoNormal"><span lang="EN-US">CodeIgniter is a PHP based programming framework which implements the model-view-controller paradigm. All HTTP requests have to pass the central index.php file (provided by CI) which initiates the framework controllers to load the views and render a site. So it is not possible to directly call a specific site by entering its URL. To open a specific site the according controller has to be called by passing its name as HTTP-Get-Variable to the central index.php. As a consequence every HTTP request is redirected to one single file and the URLs always contain variables which make them search engine and user unfriendly.</span></p><p>&nbsp;</p>
1 answer

Use the apache mod_rewrite

The default CodeIgniter URL is composed in the following way:http://domain.com/index.php?myController/myMethod/param1/param2/param3This URL loads the file myController.php in the controller subdirectory and calls the public method myMethod(“param1”, “param2”, “param3”) with the given strings as parameters. What I wanted to do was hiding the substring “index.php?” from the users to make the URL look better. The website runs under the apache webserver so I used the rewrite module to finish this task. So before you continue, make sure that this module is running properly. The first step I had to do was writing an .htaccess file which contains those few lines of code and save it in the directory where the index.php is located: <code>    RewriteEngine On    RewriteBase /    RewriteCond %{REQUEST_FILENAME} !-f    RewriteCond %{REQUEST_FILENAME} !-d    RewriteRule ^(.*)$ index.php?/$1 [L] </code>The first line activates the rewrite module. The second line states the scope of the rewrite rule. Since the index.php and the .htaccess files are located in the same folder I used a backslash to use the current directory as the scope. The RewriteCond commands can be perceived as conditions that have to be met until the rewrite rule is activated. My two conditions test if the URL calls another file (f) or directory (d) that exist in the current directory. If so, the URL want be changed and the desired resources will be loaded. This is important if there are any other resources than those provided by CodeIgniter in your root directory. If there are no such resources, the rule will be activated which is depicted in the last line. It says that the complete URL string after the domain plus toplevel domain (left term in the regular expression) has to be copied behind the term “index.php?/”. The $1 represents this copied value which in the upper example is the string “myController/myMethod/param1/param2/param3”. The [L] says that this is the last rule (this is just importand if we would have used a sequence of rules). In the last step we have to tell the framework that it should not use the term “index.php” for the creation of links anymore (this step is now done by the apache module implicitly). Therefore we open the file system/application/config/config.php and change the variable$config['index_page'] = "index.php"; to$config['index_page'] = '';   Thats it! After an apache restart the thing should be working!

Taggings: