.htaccess rewrite GET variables .htaccess rewrite GET variables php php

.htaccess rewrite GET variables


Basically what people try to say is, you can make a rewrite rule like so:

RewriteRule ^(.*)$ index.php?params=$1 [NC, QSA]

This will make your actual php file like so:

index.php?params=param/value/param/value

And your actual URL would be like so:

http://url.com/params/param/value/param/value

And in your PHP file you could access your params by exploding this like so:

<?php$params = explode( "/", $_GET['params'] );for($i = 0; $i < count($params); $i+=2) {  echo $params[$i] ." has value: ". $params[$i+1] ."<br />";}?>


I think it's better if you redirect all requests to the index.php file and then extract the controller name and any other parameters using php. Same as any other frameworks such as Zend Framework.

Here is simple class that can do what you are after.

class HttpRequest{    /**     * default controller class     */    const CONTROLLER_CLASSNAME = 'Index';    /**     * position of controller     */    protected $controllerkey = 0;    /**     * site base url     */    protected $baseUrl;    /**     * current controller class name     */    protected $controllerClassName;    /**     * list of all parameters $_GET and $_POST     */    protected $parameters;    public function __construct()    {        // set defaults        $this->controllerClassName = self::CONTROLLER_CLASSNAME;    }    public function setBaseUrl($url)    {        $this->baseUrl = $url;        return $this;    }    public function setParameters($params)    {        $this->parameters = $params;        return $this;    }    public function getParameters()    {        if ($this->parameters == null) {            $this->parameters = array();        }        return $this->parameters;    }    public function getControllerClassName()    {        return $this->controllerClassName;    }    /**     * get value of $_GET or $_POST. $_POST override the same parameter in $_GET     *      * @param type $name     * @param type $default     * @param type $filter     * @return type      */    public function getParam($name, $default = null)    {        if (isset($this->parameters[$name])) {            return $this->parameters[$name];        }        return $default;    }    public function getRequestUri()    {        if (!isset($_SERVER['REQUEST_URI'])) {            return '';        }        $uri = $_SERVER['REQUEST_URI'];        $uri = trim(str_replace($this->baseUrl, '', $uri), '/');        return $uri;    }    public function createRequest()    {        $uri = $this->getRequestUri();        // Uri parts        $uriParts = explode('/', $uri);        // if we are in index page        if (!isset($uriParts[$this->controllerkey])) {            return $this;        }        // format the controller class name        $this->controllerClassName = $this->formatControllerName($uriParts[$this->controllerkey]);        // remove controller name from uri        unset($uriParts[$this->controllerkey]);        // if there are no parameters left        if (empty($uriParts)) {            return $this;        }        // find and setup parameters starting from $_GET to $_POST        $i = 0;        $keyName = '';        foreach ($uriParts as $key => $value) {            if ($i == 0) {                $this->parameters[$value] = '';                $keyName = $value;                $i = 1;            } else {                $this->parameters[$keyName] = $value;                $i = 0;            }        }        // now add $_POST data        if ($_POST) {            foreach ($_POST as $postKey => $postData) {                $this->parameters[$postKey] = $postData;            }        }        return $this;    }    /**     * word seperator is '-'     * convert the string from dash seperator to camel case     *      * @param type $unformatted     * @return type      */    protected function formatControllerName($unformatted)    {        if (strpos($unformatted, '-') !== false) {            $formattedName = array_map('ucwords', explode('-', $unformatted));            $formattedName = join('', $formattedName);        } else {            // string is one word            $formattedName = ucwords($unformatted);        }        // if the string starts with number        if (is_numeric(substr($formattedName, 0, 1))) {            $part = $part == $this->controllerkey ? 'controller' : 'action';            throw new Exception('Incorrect ' . $part . ' name "' . $formattedName . '".');        }        return ltrim($formattedName, '_');    }}

How to use it:

$request = new HttpRequest();$request->setBaseUrl('/your/base/url/');$request->createRequest();echo $request->getControllerClassName(); // return controller name. Controller name separated by '-' is going to be converted to camel case.var_dump ($request->getParameters());    // print all other parameters $_GET & $_POST

.htaccess file:

RewriteEngine OnRewriteCond %{REQUEST_FILENAME} -s [OR]RewriteCond %{REQUEST_FILENAME} -l [OR]RewriteCond %{REQUEST_FILENAME} -dRewriteRule ^.*$ - [NC,L]RewriteRule ^.*$ index.php [NC,L]


Your rewrite rule would pass the entire URL:

RewriteRule ^(.*)$ index.php?params=$1 [NC]

Your index.php would interpret that full path as controller/param/value/param/value for you (my PHP is a little rusty):

$params = explode("/", $_GET['params']);if (count($params) % 2 != 1) die("Invalid path length!");$controller = $params[0];$my_params = array();for ($i = 1; $i < count($params); $i += 2) {  $my_params[$params[$i]] = $params[$i + 1];}