2012-10-12 175 views
5

Estoy programando un sitio web que tiene muchos usuarios almacenados en una base de datos mysql_donde cada usuario tiene una ID y un nombre de perfil (como jim.button.1) entre otros campos. Quiero una URL (que es conseguir el perfil a través de por ejemplo un mysql_select en la identificación de usuario) que tiene esta estructura: www.mysite.com/jim.button.1creando miles de URL a través de mod-rewrite

Ahora sé que yo podría hacer eso con un mod_rewrite_rule , pero con miles de usuarios obtendré un archivo .htaccess muy grande. No soy, por cierto, un experto en modificación de mods, pero entiendo cómo funciona.

¿Hay alguna manera de hacerlo, por ejemplo, en una o dos reglas mod_rewrite_ o hay otra manera inteligente de lograr esto?

Toda la ayuda es bienvenida.

Respuesta

1

Puede usar algo como esto:

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

En su users.php puede obtener el usuario de esta manera:

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

Hay que afinar esto para conseguir que integra con el resto de su sitio, pero se entiende la idea.

+0

¿Por qué votar abajo? ¿Es mi votante de serie abajo de nuevo? – JvdBerg

+0

Tu respuesta me parece bien. Subí. –

+0

Su regla de reescritura coincidirá con * cada * solicitud, por lo que los archivos reales ('.css',' .js', '.jpg', etc.) no se servirán. Probablemente no es lo que quiere el OP. –

2

Se podría volver a escribir todas las URL que no se asignan a un archivo existente, usando:

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

y luego agarre la URL real a través de $_SERVER['REQUEST_URI']. Aquí hay un ejemplo:

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

Consulte https://github.com/zendframework/ZendSkeletonApplication/blob/master/public/.htaccess para ver un ejemplo.

1

que combinaría tanto Ross Smith y JvdBerg de lo que iba a terminar con algo como:

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

lo que haría más fácil de procesar en su secuencia de comandos en lugar de tener que analizar la URL completa. El comienzo de 4 líneas después de encender el RewriteEngine es necesario para que el resto del sitio pueda seguir funcionando (comprueba el directorio, el archivo, los enlaces) y si el URL es uno usará la primera regla y no procesará más. Y luego la segunda regla es si no es una de las anteriores y redirecciones como llegar a su página 'profile.php'.

Luego, en su página de 'profile.php', usted puede conseguir sus valores como:

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

e ir de allí.

+0

También quiero agregar que si planea agregar más reglas más tarde, debe ser lo más específico posible con su 'RewriteRule' ahora. Así que 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] 'y accediendo a ellos a través de' $ _REQUEST ['fname'] ',' $ _REQUEST ['lname'] ', y' $ _REQUEST ['uid'] 'en su script. También asegurará que el formato sea el que espera y restrinja el URI para tener conjuntos de caracteres que espera para su PHP. – Jon

+0

¡Por fin tengo tiempo para implementar esto y tu respuesta es muy útil! Gracias. – Rob

+0

¿Por qué el voto a favor? Si vas a rechazar algo, al menos deja un comentario sobre por qué. – Jon

Cuestiones relacionadas