2009-05-01 38 views
47

Normalmente, la práctica o forma muy antigua de mostrar alguna página de perfil es la siguiente:Cómo crear una URL amigable en php?

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

donde u=12345 es el identificador de usuario.

En los últimos años, me encontré con un sitio web con muy buenas URLs como:

www.domain.com/profile/12345 

¿Cómo puedo hacer esto en PHP?

Así como una conjetura salvaje, ¿tiene algo que ver con el archivo .htaccess? ¿Me puede dar más consejos o algún código de muestra sobre cómo escribir el archivo .htaccess?

Respuesta

36

Según this article, que desea una mod_rewrite (colocado en una .htaccess archivo) regla que se ve algo como esto:

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

Y esto asigna las peticiones de

/news.php?news_id=63 

a

/news/63.html 

Otra pos la posibilidad es hacerlo con forcetype, lo que obliga a cualquier cosa en una ruta particular a usar php para evaluar el contenido. Así, en su archivo .htaccess, puso lo siguiente:

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

Y entonces el index.php puede tomar medidas basadas en la variable $_SERVER['PATH_INFO']:

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

Un gran recurso mod_rewrite: http://www.addedbytes.com/apache/mod_rewrite-cheat-sheet/ –

+4

Sugeriría su tutorial antes de la cheatsheet: http://www.addedbytes.com/apache/url-rewriting-for-beginners/ –

+1

Otra opción, si desea hacer su reescritura de URL enteramente PHP, es establecer reglas de reescritura para dirigir todas las solicitudes a una sola secuencia de comandos . Una gran ventaja de esto es que puede almacenar su código en un área no accesible para Apache, y solo su script de despacho de URL debe ser accesible para Apache. por ejemplo: RewriteCond% {REQUEST_FILENAME}! -f RewriteCond% {REQUEST_FILENAME}! -d RewriteRule. dispatch.php Esto es similar a su ejemplo de tipo de fuerza. –

4

En realidad no es PHP, es Apache usando mod_rewrite. Lo que sucede es que la persona solicita el enlace, www.example.com/profile/12345 y luego apache lo corta usando una regla de reescritura que hace que se vea así, www.example.com/profile.php?u=12345, al servidor. Puede encontrar más aquí: Rewrite Guide

-3

Parece que está hablando de un servicio web RESTful.

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

archivo .htaccess La hace volver a escribir todos los URI para que apunte a un controlador, pero que es más detallada a continuación, usted desea conseguir en este punto. Es posible que desee ver en Recess

Es un marco REST todo en PHP

+2

Técnicamente, supongo que tienes razón, pero a menos que el OP ya tenga experiencia con la idea REST, incluso leer ese artículo de Wikipedia es mucho más esfuerzo de lo que el problema necesita. Invocar un paradigma de programación completo es excesivo para esta situación. –

+0

¿De verdad? No creo que sus preguntas fueran exactamente "¿Cómo hago profile.php? U = 12345 goto/profile/12345", lo interpreté como un "¿Cómo se hace esto en entornos de producción?". Creo que es beneficioso saber que existe un paradigma y no tener un archivo .htaccess lleno de redireccionamientos cuando existe una forma adecuada de abordar ese problema. – ryanday

21

recientemente he utilizado la siguiente en una aplicación que está funcionando bien para mis necesidades.

.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 no es la única respuesta. También puede usar Opciones + MultiViews en .htaccess y luego marcar $_SERVER REQUEST_URI para encontrar todo lo que está en la URL.

+0

Sí, pero MultiViews es asqueroso ... Diría que es demasiado general para este uso. –

0

Hay muchas maneras diferentes de hacerlo. Una forma es utilizar las técnicas RewriteRule mencionadas anteriormente para enmascarar valores de cadena de consulta.

Una de las maneras que realmente me gustan es si usa el patrón front controller, también puede usar direcciones como http://yoursite.com/index.php/path/to/your/page/here y analizar el valor de $ _SERVER ['REQUEST_URI'].

se puede extraer fácilmente el/ruta/a/su/página/aquí bits con la siguiente trozo de código:

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

A partir de ahí, se puede analizar sin embargo que usted quiera, pero para los de Pete aras maquillaje seguro que lo esterilizas;)

10

Intento explicar este problema paso a paso en el siguiente ejemplo.

0) Pregunta

trato de preguntarle como esto:

Quiero abrir la página de perfil de facebook como www.facebook.com/kaila.piyush

que llegar Identificación de url y analizarlo en el archivo profile.php y devolver los datos de la base de datos y mostrar al usuario su perfil

Normalmente, cuando desarrollamos cualquier sitio web, su enlace se parece a www.websit e.com/profile.php?id=username example.com/weblog/index.php?y=2000 & m = 11 d = 23 & & id = 5678

ahora nos ponemos al día con el nuevo estilo no nos reescribir utilizar www.website.com/username o example.com/weblog/2000/11/23/5678 como enlace permanente

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

Crear un archivo .htaccess en la carpeta raíz o actualice el existente:

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

¿Qué significa eso?

Si la solicitud es para un directorio o archivo real (uno que existe en el servidor), index.php no se sirve, de lo contrario, cada URL se redirige a index.php.

2) index.php

Ahora, queremos saber qué acción para disparar, por lo que necesitamos para leer la URL:

En 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

Ahora en el archivo profile.php, deberíamos tener algo como t la suya:

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

gracias por la publicación detallada, siempre quise aprender, cómo sitios como Wordpress generan URLs bonitas y pueden acceder a ellas sin editar el archivo htaccess cada vez, gracias – AMB

+0

Esto es justo lo que estaba buscando. – Aiapaec

Cuestiones relacionadas