htaccess - ¿Cómo crear una URL amigable en php?
url amigables php sin htaccess (8)
Normalmente, la práctica o la forma muy antigua de mostrar alguna página de perfil es la siguiente:
www.domain.com/profile.php?u=12345
donde u=12345
es la identificación del usuario.
En los últimos años, encontré un sitio web con URL muy agradables como:
www.domain.com/profile/12345
¿Cómo hago esto en PHP?
Solo como una suposición descabellada, ¿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
?
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. Puedes encontrar más aquí: Reescribe la guía
Hay muchas formas diferentes de hacer esto. Una forma es utilizar las técnicas RewriteRule mencionadas anteriormente para enmascarar valores de cadena de consulta.
Una de las maneras que realmente me gusta es que si usa el patrón del controlador frontal , también puede usar URL como http://yoursite.com/index.php/path/to/your/page/here y analizar el valor de $ _SERVER [''REQUEST_URI''].
Puede extraer fácilmente el bit / path / to / your / page / here con el siguiente bit de código:
$route = substr($_SERVER[''REQUEST_URI''], strlen($_SERVER[''SCRIPT_NAME'']));
A partir de ahí, puedes analizarlo como quieras, pero por el bien de ti, asegúrate de desinfectarlo;)
Intento explicar este problema paso a paso en el siguiente ejemplo.
0) Pregunta
Intento preguntarte así:
Quiero abrir la página como perfil de Facebook www.facebook.com/kaila.piyush
obtiene ID de url y lo analiza en el archivo profile.php y devuelve datos de búsqueda de la base de datos y muestra al usuario su perfil
Normalmente, cuando desarrollamos un sitio web, su enlace se ve como www.website.com/profile.php?id=username example.com/weblog/index.php?y=2000&m=11&d=23&id=5678
ahora actualizamos con un nuevo estilo y no reescribimos el uso de 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
Cree 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é hace 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 activar, por lo que debemos 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 esto:
// 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);
}
Manera simple de hacer esto. Prueba este código Coloque el código en su archivo htaccess
:
Options +FollowSymLinks
RewriteEngine on
RewriteRule profile/(.*)/ profile.php?u=$1
RewriteRule profile/(.*) profile.php?u=$1
Creará este tipo de URL bonita:
Para más htaccess Pretty URL: http://www.webconfs.com/url-rewriting-tool.php
ModRewrite no es la única respuesta. También puede usar Options + MultiViews en .htaccess y luego marcar $_SERVER REQUEST_URI
para encontrar todo lo que está en la URL.
Parece que estás hablando de un servicio web RESTful.
http://en.wikipedia.org/wiki/Representational_State_Transfer
El archivo .htaccess reescribe todos los URI para apuntar a un controlador, pero eso es más detallado que lo que desea obtener en este punto. Es posible que desee ver Recess
Es un marco RESTful todo en PHP
Recientemente utilicé lo siguiente en una aplicación que funciona 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.
}
Según este artículo , desea una regla mod_rewrite (colocada en un archivo .htaccess
) que se parece a esto:
RewriteEngine on
RewriteRule ^/news/([0-9]+)/.html /news.php?news_id=$1
Y esto mapea las solicitudes de
/news.php?news_id=63
a
/news/63.html
Otra posibilidad es hacerlo con forcetype
, que obliga a cualquier cosa en un camino particular a usar php para evaluar el contenido. Entonces, en su archivo .htaccess
, ponga lo siguiente:
<Files news>
ForceType application/x-httpd-php
</Files>
Y luego el index.php puede tomar medidas basadas en la variable $_SERVER[''PATH_INFO'']
:
<?php
echo $_SERVER[''PATH_INFO''];
// outputs ''/63.html''
?>