2012-10-12 15 views
5

Sto programmando un sito Web che ha un sacco di utenti memorizzati in un mysql_database in cui ogni utente ha un ID e nome profilo (come jim.button.1) tra gli altri campi. Voglio un URL (che ottiene il profilo attraverso ad esempio un mysql_select sul userID) che ha questa struttura: www.mysite.com/jim.button.1creazione di migliaia di URL tramite mod-rewrite

Ora so che avrei potuto farlo con un mod_rewrite_rule , ma con migliaia di utenti otterrò un file .htaccess molto grande. A proposito, non sono un esperto di mod rewrite, ma capisco come funziona.

C'è un modo per farlo, diciamo in uno o due mod_rewrite_rules o c'è un altro modo intelligente per realizzare questo?

Tutti gli aiuti sono i benvenuti.

risposta

1

Si può usare qualcosa di simile:

RewriteEngine On 
RewriteRule ^(.+)$ users.php?user=$1 [QSA,L] 

Nel vostro users.php è possibile ottenere l'utente in questo modo:

$user = $_GET['user']; 
// do your stuff with the user 

Bisogna mettere a punto questo per farlo integrato con il resto del tuo sito, ma ti viene l'idea.

+0

Perché il voto negativo? È di nuovo il mio serial down voter? – JvdBerg

+0

La tua risposta mi sembra soddisfacente. Ho votato in su. –

+0

La regola di riscrittura corrisponderà a * ogni * richiesta, quindi i file effettivi ('.css',' .js', '.jpg', ecc.) Non saranno pubblicati. Probabilmente non è quello che l'OP vuole. –

2

Si potrebbe riscrivere tutti gli URL che non mappano a un file esistente, utilizzando:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^.*$ - [NC,L] 
    RewriteRule ^.*$ index.php [NC,L] 
</IfModule> 

poi prendete l'URL effettivo via $_SERVER['REQUEST_URI']. Ecco un esempio:

$parts = parse_url($_SERVER['REQUEST_URI']); 
$user = $parts['path']; 

Vedere https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/.htaccess per un esempio.

1

vorrei combinare entrambi Ross Smith e JvdBerg di modo che ci si finisce con qualcosa di simile:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^.*$ - [NC,L] 
    RewriteRule ^(.*)$ profile.php?user=$1 [NC,L] 
</IfModule> 

che renderebbe più facile per elaborare nello script, piuttosto che dover analizzare l'intero URL. Le 4 righe iniziali dopo aver attivato lo RewriteEngine sono necessarie affinché il resto del sito possa continuare a funzionare (controlla directory, file, collegamenti) e se l'url è uno utilizzerà la prima regola e non elaborerà più. E poi la seconda regola è se non è uno dei precedenti e reindirizzamenti come arrivare alla tua pagina 'profile.php'.

Poi nella tua pagina 'profile.php', è possibile ottenere i valori come:

list($fname, $lname, $id) = explode('.', $_REQUEST['user']); 

e passare da lì.

+0

Voglio anche aggiungere che se hai intenzione di aggiungere più regole in un secondo momento, dovresti essere il più specifico possibile con il tuo 'RewriteRule'. Quindi cambiando 'RewriteRule^(. *) $ Profile.php? User = $ 1 [NC, L]' a 'RewriteRule ([a-zA-Z] +) \. ([A-zA-Z] +) \. ([0-9] +) $ profile.php? Fname = $ 1 & lname = $ 2 & uid = $ 3 [NC, L] 'e accedendoli tramite' $ _REQUEST ['fname'] ',' $ _REQUEST ['lname'] ', e' $ _REQUEST ['uid'] 'nel tuo script. Garantirà inoltre che il formato è quello che ti aspetti e limita l'URI ad avere set di caratteri che ti aspetti per il tuo PHP. – Jon

+0

Finalmente ho il tempo di implementare questo e la tua risposta è molto utile! Grazie. – Rob

+0

Perché il downvote? Se hai intenzione di downvotare qualcosa, almeno lascia un commento sul perché. – Jon

Problemi correlati