Si solo desea cambiar la ruta para picture.php
luego agregar la regla de reescritura .htaccess
servirá a sus necesidades, pero, si desea la reescritura de URL como en Wordpress, entonces PHP es el camino. Aquí hay un ejemplo simple para comenzar.
Estructura de carpetas
Hay dos archivos que se necesitan en la carpeta raíz, .htaccess
y index.php
sería bueno colocar el resto de los .php
archivos en una carpeta separada, como inc/
.
root/
inc/
.htaccess
index.php
.htaccess
RewriteEngine On
RewriteRule ^inc/.*$ index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
Este archivo tiene cuatro directivas:
RewriteEngine
- habilitar el motor de reescritura
RewriteRule
- denegar el acceso a todos los archivos en la inc/
carpeta, redirigir cualquier llamada a esa carpeta aindex.php
RewriteCond
- Permitir acceso directo a todos los demás archivos (como imágenes, CSS o scripts)
RewriteRule
- redirigir cualquier otra cosa a index.php
index.php
Como ahora todo se redirige a index.php, se determinará si la url es correcta, si todos los parámetros están presentes y si el tipo de parámetros es correcto.
Para probar la url necesitamos tener un conjunto de reglas, y la mejor herramienta para eso es una expresión regular. Al usar expresiones regulares mataremos dos moscas de un solo golpe. Url, para pasar esta prueba debe tener todos los parámetros necesarios que se prueban en los caracteres permitidos. Aquí hay algunos ejemplos de reglas.
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
Lo siguiente es preparar la solicitud uri.
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
Ahora que tenemos la solicitud uri, el paso final es probar uri en las reglas de expresión regular.
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
}
}
La coincidencia exitosa, ya que usamos subpatrones con nombre en expresiones regulares, llenará la $params
matriz casi de la misma manera que PHP llena la $_GET
matriz. Sin embargo, cuando se utiliza una url dinámica, la $_GET
matriz se llena sin ninguna verificación de los parámetros.
/ picture / some + text / 51
Formación
(
[0] => / imagen / algún texto / 51
[texto] => algún texto
[1] => algún texto
[id] => 51
[2] => 51
)
picture.php? text = some + text & id = 51
Formación
(
[texto] => algún texto
[id] => 51
)
Estas pocas líneas de código y un conocimiento básico de las expresiones regulares son suficientes para comenzar a construir un sistema de enrutamiento sólido.
Fuente completa
define( 'INCLUDE_DIR', dirname( __FILE__ ) . '/inc/' );
$rules = array(
'picture' => "/picture/(?'text'[^/]+)/(?'id'\d+)", // '/picture/some-text/51'
'album' => "/album/(?'album'[\w\-]+)", // '/album/album-slug'
'category' => "/category/(?'category'[\w\-]+)", // '/category/category-slug'
'page' => "/page/(?'page'about|contact)", // '/page/about', '/page/contact'
'post' => "/(?'post'[\w\-]+)", // '/post-slug'
'home' => "/" // '/'
);
$uri = rtrim( dirname($_SERVER["SCRIPT_NAME"]), '/' );
$uri = '/' . trim( str_replace( $uri, '', $_SERVER['REQUEST_URI'] ), '/' );
$uri = urldecode( $uri );
foreach ( $rules as $action => $rule ) {
if ( preg_match( '~^'.$rule.'$~i', $uri, $params ) ) {
/* now you know the action and parameters so you can
* include appropriate template file ( or proceed in some other way )
*/
include( INCLUDE_DIR . $action . '.php' );
// exit to avoid the 404 message
exit();
}
}
// nothing is found so handle the 404 error
include( INCLUDE_DIR . '404.php' );