User friendly URLs - mod rewrite and php redirections

前端 未结 4 615
我在风中等你
我在风中等你 2021-01-18 13:18

So far I\'ve done this:

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


        
4条回答
  •  情话喂你
    2021-01-18 13:59

    With help from both Aatch and Sally and a few search results on URL routing, I've got the following method to achieve what I was after so I thought I'd share it with everyone in case anybody might want to use it...

    First of all I need to mention the site I'm working on is within 2 sub-directories of the root folder mysite.com/sub/folder/index.php hence why on the arrays I'm starting from [3]

    With that said my .htaccess file is as followed:

    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . sub/folder/index.php [QSA,L]
    

    This, as far as I'm away, gets anything that is written after sub/folder/ and redirects the page straight back to the index.php, however, it masks the URL in the address bar.

    The only time it ignores this is if the sub directory actually exists. So for example I have a folder /sub/folder/signup/ if I was to type that in the address bar, because the directory exists then you are not redirected to the index.php file but sent to the directory requested, just like normal.

    Now on my index.php file (Remember I'm starting at $uri[3] because I'm in sub folders!)

    $uri = $_SERVER['REQUEST_URI']; // This brings back /sub/folder/foo/bar/test/
    $uri = explode("/", $uri); // Separate each one
    
    $var_one = $uri[3]; // foo
    $var_two = $uri[4]; // bar
    $var_three = $uri[5]; // test
    
    switch ($var_one) {
    
        case '':
        case 'home':
            include('home.php');
            exit();
            break;
    
        case 'signout':
        case 'logout':
            include('signout.php');
            exit();
            break;
    
        case 'dashboard':
        case 'dash':
            include('dashboard.php');
            exit();
        break;
    
    }
    
    // By Username
        $data_array = array(':username' => $var_one);
        $select_account = $connect->prepare("SELECT * FROM `users` WHERE `username` = :username");
        $select_account -> execute($data_array);
        $account_amount = $select_account->rowCount();
        if ($account_amount > 0) { include('profile.php'); exit(); }
    
    // By Account ID
        $data_array = array(':id' => $var_one);
        $select_account = $connect->prepare("SELECT * FROM `users` WHERE `id` = :id");
        $select_account -> execute($data_array);
        $account_amount = $select_account->rowCount();
        if ($account_amount > 0) { include('profile.php'); exit(); }
    
    include('page_not_found.php');
    

    The switch cases are simple includes, if the url is: /sub/folder/dashboard/ then dashboard.php is shown. If none of the cases match then we could possibly be looking at a profile. The first checks to see if it could be a username, if it exists then the view profile page is displayed. Then, it checks to see if it could be the unique ID number for that profile and does the same check.

    Finally, if no results are brought back from any of them, then we are shown a 404 page not found page.

    If it was a profile page, on the profile.php file I can then run checks for $var_two and see if they have uploaded a photo album under that name, for example /sub/folder/joe/holiday/ if yes, then run a query to fetch it all, if not, display a message/redirect or whatever.

    Then if there is even more, say a specific picture ($var_three) in that folder ($var_two), for example /sub/folder/joe/holiday/beach/ - then run it through a similar query showing the results.

    It may not be the best method but it's pretty straight forward and everything is working as I'd like it too so I can't really complain.

提交回复
热议问题