How to create friendly URL in php?

后端 未结 8 1838
一整个雨季
一整个雨季 2020-11-21 11:06

Normally, the practice or very old way of displaying some profile page is like this:

www.domain.com/profile.php?u=12345

where u=12345

相关标签:
8条回答
  • 2020-11-21 11:39

    It's actually not PHP, it's apache using mod_rewrite. What happens is the person requests the link, www.example.com/profile/12345 and then apache chops it up using a rewrite rule making it look like this, www.example.com/profile.php?u=12345, to the server. You can find more here: Rewrite Guide

    0 讨论(0)
  • 2020-11-21 11:41

    ModRewrite is not the only answer. You could also use Options +MultiViews in .htaccess and then check $_SERVER REQUEST_URI to find everything that is in URL.

    0 讨论(0)
  • 2020-11-21 11:44

    I recently used the following in an application that is working well for my needs.

    .htaccess

    <IfModule mod_rewrite.c>
    # enable rewrite engine
    RewriteEngine On
    
    # if requested url does not exist pass it as path info to index.php
    RewriteRule ^$ index.php?/ [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule (.*) index.php?/$1 [QSA,L]
    </IfModule>
    

    index.php

    foreach (explode ("/", $_SERVER['REQUEST_URI']) as $part)
    {
        // Figure out what you want to do with the URL parts.
    }
    
    0 讨论(0)
  • 2020-11-21 11:46

    I try to explain this problem step by step in following example.

    0) Question

    I try to ask you like this :

    i want to open page like facebook profile www.facebook.com/kaila.piyush

    it get id from url and parse it to profile.php file and return featch data from database and show user to his profile

    normally when we develope any website its link look like www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678

    now we update with new style not rewrite we use www.website.com/username or example.com/weblog/2000/11/23/5678 as permalink

    http://example.com/profile/userid (get a profile by the ID) 
    http://example.com/profile/username (get a profile by the username) 
    http://example.com/myprofile (get the profile of the currently logged-in user)
    

    1) .htaccess

    Create a .htaccess file in the root folder or update the existing one :

    Options +FollowSymLinks
    # Turn on the RewriteEngine
    RewriteEngine On
    #  Rules
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /index.php
    

    What does that do ?

    If the request is for a real directory or file (one that exists on the server), index.php isn't served, else every url is redirected to index.php.

    2) index.php

    Now, we want to know what action to trigger, so we need to read the URL :

    In index.php :

    // index.php    
    
    // This is necessary when index.php is not in the root folder, but in some subfolder...
    // We compare $requestURL and $scriptName to remove the inappropriate values
    $requestURI = explode(‘/’, $_SERVER[‘REQUEST_URI’]);
    $scriptName = explode(‘/’,$_SERVER[‘SCRIPT_NAME’]);
    
    for ($i= 0; $i < sizeof($scriptName); $i++)
    {
        if ($requestURI[$i] == $scriptName[$i])
        {
            unset($requestURI[$i]);
        }
    }
    
    $command = array_values($requestURI);
    With the url http://example.com/profile/19837, $command would contain :
    
    $command = array(
        [0] => 'profile',
        [1] => 19837,
        [2] => ,
    )
    Now, we have to dispatch the URLs. We add this in the index.php :
    
    // index.php
    
    require_once("profile.php"); // We need this file
    switch($command[0])
    {
        case ‘profile’ :
            // We run the profile function from the profile.php file.
            profile($command([1]);
            break;
        case ‘myprofile’ :
            // We run the myProfile function from the profile.php file.
            myProfile();
            break;
        default:
            // Wrong page ! You could also redirect to your custom 404 page.
            echo "404 Error : wrong page.";
            break;
    }
    

    2) profile.php

    Now in the profile.php file, we should have something like this :

    // profile.php
    
    function profile($chars)
    {
        // We check if $chars is an Integer (ie. an ID) or a String (ie. a potential username)
    
        if (is_int($chars)) {
            $id = $chars;
            // Do the SQL to get the $user from his ID
            // ........
        } else {
            $username = mysqli_real_escape_string($char);
            // Do the SQL to get the $user from his username
            // ...........
        }
    
        // Render your view with the $user variable
        // .........
    }
    
    function myProfile()
    {
        // Get the currently logged-in user ID from the session :
        $id = ....
    
        // Run the above function :
        profile($id);
    }
    
    0 讨论(0)
  • 2020-11-21 11:54

    It looks like you are talking about a RESTful webservice.

    http://en.wikipedia.org/wiki/Representational_State_Transfer

    The .htaccess file does rewrite all URIs to point to one controller, but that is more detailed then you want to get at this point. You may want to look at Recess

    It's a RESTful framework all in PHP

    0 讨论(0)
  • 2020-11-21 11:56

    There are lots of different ways to do this. One way is to use the RewriteRule techniques mentioned earlier to mask query string values.

    One of the ways I really like is if you use the front controller pattern, you can also use urls like http://yoursite.com/index.php/path/to/your/page/here and parse the value of $_SERVER['REQUEST_URI'].

    You can easily extract the /path/to/your/page/here bit with the following bit of code:

    $route = substr($_SERVER['REQUEST_URI'], strlen($_SERVER['SCRIPT_NAME']));
    

    From there, you can parse it however you please, but for pete's sake make sure you sanitise it ;)

    0 讨论(0)
提交回复
热议问题