How to process Clean URLs and Queries?

178 views Asked by At

I have decided to build a web application using clean urls. However its seems to be quite hard for at first. I have experienced many problems during testing and I couldn't figure out how is it recommended to build Clean URLs basically.

I have finally decided to redirect everything to the index.php and process the URI from there.

This is my .htaccess file:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php?url=$0 [QSA]

In the PHP end I have created this, so only the URLs in the array will be passed:

    $root_path = '/';

    $uri = $_SERVER['REQUEST_URI'];
    $url = array(
        $root_path . 'login' => 'login'
        );
    $url_basic = array_keys($url);
    $url_slash = array_keys($url);
    array_walk($url_slash, function(&$value, $key) { $value .= '/'; return $value;});

    if (in_array($uri, $url_basic) || in_array($uri, $url_slash)) {
        $uri = rtrim($uri,'/');
        require $url[$uri] . '.php';
        exit();
    }   else {
        echo 'Bad';
    }

So basically if someone types: /login or /login/ they'll have the login.php required, otherwise they'll stay on the index.php page (as APACHE redirects everything else).

Question:

Let's say that the user has received an error while trying to log in. In this case I guess the best way (or if its not the best way, please tell me) to pass a $_GET variable with the name of 'error' for example. So the user would get: /login/?error=1

How is it possible to achieve that result? Because if I type that I get redirected to the index.php page. Can anyone please help me?

2

There are 2 answers

0
rolisz On

You can look at $_SERVER['QUERY_STRING'] at cut the query string out of $_SERVER['REQUEST_URI']:

if ($_SERVER['QUERY_STRING'])   
    echo substr($_SERVER['REQUEST_URI'], 0, -strlen($_SERVER['QUERY_STRING']) - 1);

The -1 is there to remove the question mark as well.

But setting the error in GET is not necessary. You can use a flash message and store the error in the session. You can find a simple way to use them here.

0
simon.ro On

Maybe you should consider using a routing system as that of

Symfony: http://symfony.com/doc/current/book/routing.html or its slimmer counterpart

Silex: http://silex.sensiolabs.org/doc/usage.html#routing