web-dev-qa-db-fra.com

Comment créer une URL conviviale en php?

Normalement, la pratique ou la manière très ancienne d'afficher une page de profil est la suivante:

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

u=12345 est l'ID utilisateur.

Ces dernières années, j'ai trouvé un site Web avec des URL très sympas comme:

www.domain.com/profile/12345

Comment faire cela en PHP?

Tout comme une supposition sauvage, est-ce quelque chose à voir avec le .htaccess fichier? Pouvez-vous me donner plus de conseils ou un exemple de code sur la façon d'écrire le .htaccess fichier?

63
Peter

Selon cet article , vous voulez un mod_rewrite (placé dans un .htaccess file) règle qui ressemble à ceci:

RewriteEngine on
RewriteRule ^/news/([0-9]+)\.html /news.php?news_id=$1

Et cela cartographie les demandes de

/news.php?news_id=63

à

/news/63.html

Une autre possibilité est de le faire avec forcetype, ce qui force tout ce qui se trouve sur un chemin particulier à utiliser php pour évaluer le contenu. Donc, dans votre .htaccess fichier, mettez ce qui suit:

<Files news>
    ForceType application/x-httpd-php
</Files>

Et puis le fichier index.php peut prendre des mesures en fonction du $_SERVER['PATH_INFO'] variable:

<?php
    echo $_SERVER['PATH_INFO'];
    // outputs '/63.html'
?>
44
cgp

J'ai récemment utilisé ce qui suit dans une application qui fonctionne bien pour mes besoins.

.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.
}
28
Jordan S. Jones

J'essaie d'expliquer ce problème étape par étape dans l'exemple suivant.

) Question

J'essaye de te demander comme ça:

je veux ouvrir une page comme le profil facebook www.facebook.com/kaila.piyush

il obtient l'identifiant de l'url et l'analyse dans le fichier profile.php et renvoie les données featch de la base de données et montre l'utilisateur à son profil

normalement, lorsque nous développons un site Web, son lien ressemble à www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678

maintenant nous mettons à jour avec un nouveau style pas réécrire nous utilisons www.website.com/username ou example.com/weblog/2000/11/23/5678 comme permalien

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

Créez un fichier .htaccess dans le dossier racine ou mettez à jour le fichier existant:

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

Qu'est-ce que ça fait?

Si la demande concerne un vrai répertoire ou fichier (celui qui existe sur le serveur), index.php n'est pas servi, sinon chaque URL est redirigée vers index.php.

2) index.php

Maintenant, nous voulons savoir quelle action déclencher, nous devons donc lire l'URL:

Dans 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

Maintenant, dans le fichier profile.php, nous devrions avoir quelque chose comme ceci:

// 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);
}
14
Piyush

Un moyen simple de le faire. Essayez ce code. Mettez du code dans votre fichier htaccess:

Options +FollowSymLinks

RewriteEngine on

RewriteRule profile/(.*)/ profile.php?u=$1

RewriteRule profile/(.*) profile.php?u=$1   

Il créera ce joli joli URL:

http://www.domain.com/profile/12345/

Pour plus de htaccess Pretty URL: http://www.webconfs.com/url-rewriting-tool.php

8
Hemal Halari

Ce n'est en fait pas PHP, c'est Apache utilisant mod_rewrite. Ce qui se passe, c'est que la personne demande le lien, www.example.com/profile/12345, puis Apache le coupe en utilisant une règle de réécriture la faisant ressembler à ceci, www.example.com/profile.php?u=12345, au serveur. Vous pouvez trouver plus ici: Guide de réécriture

4
jacobangel

Mod_Rewrite n'est pas la seule réponse. Vous pouvez également utiliser Options + MultiViews dans .htaccess, puis vérifier $_SERVER REQUEST_URI Pour trouver tout ce qui est dans l'URL.

0
empi

Il existe de nombreuses façons de procéder. Une façon consiste à utiliser les techniques RewriteRule mentionnées précédemment pour masquer les valeurs de chaîne de requête.

L'une des façons que j'aime vraiment est que si vous utilisez le modèle contrôleur frontal , vous pouvez également utiliser des URL comme http://votresite.com/index.php/path/to/your/page/here et analyser la valeur de $ _SERVER ['REQUEST_URI'].

Vous pouvez facilement extraire le bit/path/to/your/page/here avec le bit de code suivant:

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

De là, vous pouvez l'analyser comme bon vous semble, mais pour l'amour de Pete, assurez-vous de le désinfecter;)

0
Shabbyrobe