2009-05-01 15 views
47

Normalmente, la pratica o molto vecchio modo di mostrare un po 'di pagina del profilo è come questo:Come creare un URL amichevole in PHP?

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

dove u=12345 è l'ID utente.

Negli ultimi anni, ho trovato qualche sito con molto bello URL del tipo:

www.domain.com/profile/12345 

Come faccio a fare questo in PHP?

Proprio come un'ipotesi, è qualcosa a che fare con il file .htaccess? Puoi darmi altri suggerimenti o qualche codice di esempio su come scrivere il file .htaccess?

risposta

36

Secondo this article, si desidera un mod_rewrite (collocato in un .htaccess file) regola che sembra qualcosa di simile:

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

E questo Mappe richieste da

/news.php?news_id=63 

a

/news/63.html 

Un altro pos la praticità lo sta facendo con forcetype, che forza tutto su un particolare percorso per usare php per valutare il contenuto. Quindi, nel file .htaccess, inserire il seguente:

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

E poi l'index.php può agire in base alla variabile $_SERVER['PATH_INFO']:

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

Una grande risorsa mod_rewrite: http://www.addedbytes.com/apache/mod_rewrite-cheat-sheet/ –

+4

Suggerisco il suo tutorial prima del cheatsheet: http://www.addedbytes.com/apache/url-rewriting-for-beginners/ –

+1

Un'altra opzione, se si desidera eseguire la riscrittura dell'URL interamente in PHP, consiste nell'impostare regole di riscrittura per indirizzare tutte le richieste a un singolo script . Un grande vantaggio di questo è che puoi memorizzare il tuo codice in un'area non accessibile ad Apache, e solo il tuo script di dispatch URL deve essere accessibile da Apache. ad esempio: RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule. dispatch.php Questo è simile al tuo esempio di forcetype. –

4

In realtà non è PHP, è apache tramite mod_rewrite. Quello che succede è che la persona richiede il link, www.example.com/profile/12345 e poi apache lo ritira usando una regola di riscrittura che lo rende simile a questo, www.example.com/profile.php?u=12345, al server. Puoi trovare di più qui: Rewrite Guide

-3

Sembra che tu stia parlando di un webservice RESTful.

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

Il file .htaccess fa riscrivere tutti gli URI per puntare a un controller, ma che è più dettagliata, allora si vuole ottenere a questo punto. Si consiglia di guardare Recess

E 'un quadro RESTful tutto in PHP

+2

Tecnicamente suppongo che tu abbia ragione, ma a meno che l'OP non abbia già avuto esperienza con l'idea REST, anche leggere l'articolo di Wikipedia è molto più impegnativo di quanto non sia necessario. Invocare un intero paradigma di programmazione è eccessivo per questa situazione. –

+0

Davvero? Non penso che le sue domande fossero esattamente "Come faccio a rendere profile.php? U = 12345 goto/profilo/12345", l'ho interpretato come un generale "Come viene fatto negli ambienti di produzione?". Penso che sia utile sapere che c'è un paradigma là fuori, e non avere un file .htaccess pieno di reindirizzamenti quando c'è un modo corretto per affrontare quel problema. – ryanday

21

Recentemente ho usato il seguente in un'applicazione che funziona bene per le mie esigenze.

.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

ModRewrite non è l'unica risposta. Puoi anche utilizzare Opzioni + MultiView in .htaccess e quindi controllare $_SERVER REQUEST_URI per trovare tutto ciò che è in URL.

+0

Sì, ma MultiViews è icky ... Direi che è troppo generico per questo utilizzo. –

0

Ci sono molti modi per farlo. Un modo consiste nell'utilizzare le tecniche RewriteRule menzionate in precedenza per mascherare i valori di stringa di query.

Uno dei modi che mi piacciono di più se si utilizza il modello front controller, è possibile utilizzare anche URL come http://yoursite.com/index.php/path/to/your/page/here e analizzare il valore di $ _SERVER ['REQUEST_URI'].

Si può facilmente estrarre l'/ path/to/la vostra/page/qui bit con il seguente frammento di codice:

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

Da lì, è possibile analizzarlo però per favore, ma per di Pete amor make certezza che lo disinfetti;)

10

Cerco di spiegare questo problema passo dopo passo nel seguente esempio.

0) Domanda

cerco di chiedere a voi in questo modo:

voglio aprire la pagina come profilo facebook www.facebook.com/kaila.piyush

è ottenere l'ID da url e lo analizza al file profile.php e restituisce i dati featch dal database e mostra all'utente al suo profilo

normalmente quando sviluppiamo un sito web il suo collegamento appare come www.websit e.com/profile.php?id=username example.com/weblog/index.php?y=2000 & m = 11 & d = 23 & id = 5678

ora che aggiorniamo con il nuovo stile non riscrivere siamo utilizzare www.website.com/username o example.com/weblog/2000/11/23/5678 come 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

Creare un file .htaccess nella cartella principale o aggiornare quello esistente:

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

Che cosa fa?

Se la richiesta è per una directory o un file reale (uno esistente sul server), index.php non viene servito, altrimenti ogni URL viene reindirizzato a index.php.

2) index.php

Ora, vogliamo sapere quale azione per innescare, quindi abbiamo bisogno di leggere l'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

Ora nel file profile.php, dovremmo avere qualcosa come t his:

// 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

grazie per il post dettagliato, ho sempre voluto imparare, come siti come wordpress generano abbastanza URL e possono accedervi senza modificare il file htaccess ogni volta, grazie – AMB

+0

Questo è proprio quello che stavo cercando. – Aiapaec