Search code examples
phpmod-rewrite

Apache htaccess mod rewrite redirection using Controller GET variables in PHP index page


I am working with a custom MVC PHP framework and the index page (acting as a router) receives a GET variable "do" which contains the path that it will route to. If this variable is not set, it defaults to the Auth controller, method login.

require_once('config.php');
$controllerAction = isset($_GET['do'])?$_GET['do']:"auth/login";
require_once('core/main.php');

Then the index page (source code above) passes this $controllerAction to the main.php file, which autoloads the main controller and then loads the requested controller.

Thus, the URIs in this framework are of the form mysite.com/?do=controller/method/variable and I need it to be in the form mysite.com/controller/method/variable.

Here is the .htaccess file I tried to use, it just didn't work (I have other htaccess files working on the same server so it's not an Apache problem) :(

RewriteEngine On
RewriteRule ^([^/]*)$ /?do=$1 [L]

Someone suggested that I can do this using PHP but I am not sure how to go about that.

Edit: The error is that I get "This page cannot be displayed", 404 errors, whenever I try to directly access the mysite.com/controller/method links rather than the default mysite.com?do=controller/method

Further Edit

(please note that other virtual hosts work fine on my localhost):

(XAMPP) Apache Virtual Hosting Info:

<VirtualHost *:80>
    DocumentRoot "D:\sites\mysite.com\root\wwwroot"
    ServerName mysite.com
    ServerAlias mysite.com
  <Directory "D:\sites\mysite.com\root\wwwroot">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
  </Directory>
</VirtualHost>

File structure (Windows):

D:\
--sites
----mysite.com
--------@client_details
--------root
-----------@devfiles
-----------@vars_pwd
-----------wwwroot
--------------config
--------------core
--------------application
------------------controllers
------------------libraries
------------------models
------------------views
----------------------css
----------------------javascript
----------------------images
----------------------icons

Solution

  • First of all, there are some issues with your .htaccess contents. It's always a good idea to not rewrite if a file with the requested name exists. This allows you to have an img/ folder for your images or any other static content like CSS files, javascript, downloads, etc... The first RewriteCond tells Apache to only rewrite if no folder with this name exists. The second one does the same with files. Then you probably want the QSA (i.e. Query String Append) option, which will pass all other GET variables to your script.

    Under these conditions you can simplify the regex and use this:

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

    You might be surprised because this is more or less the same as others posted. I use similar things for many of my projects and I've just tested it, I can guarantee that it works. There must be something wrong with your apache config.

    When you have problems with mod_rewrite, the first thing you should try is to enable the module itself. Type these commands as root in your shell:

    a2enmod rewrite
    /etc/init.d/apache2 restart
    

    The first one activates the module (or complains with Module rewrite already enabled if everything is ok) and the second one restarts your Apache server. The path may of course be different on your server.

    Then you have to make sure that your VHost config allows you to use .htaccess files and do rewrites. This means AllowOverride must be set to at least FileInfo (or All). You could also try to put the rewrite rules right into the config file. Your config should look similar to this:

    <VirtualHost *:*>
        ServerName test.example.com
        ServerAlias www.test.example.com
        DocumentRoot /home/sites/test/
        <Directory "/home/sites/test/">
            Allow from all
            AllowOverride All
            Options +Indexes
        </Directory>
    </VirtualHost>
    

    Note that you have to restart Apache if you change anything in there.

    If that all doesn't help, it's always a good idea to have a look at the error logs. On my system, they're located at /var/log/apache2/error.log (Debian). They might give you more information on what's going wrong.