mvc htaccess friendly ejemplo crear amigables activar php url friendly-url

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); }



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.



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