htaccess - Reescritura de URL con PHP
redirect php htaccess (5)
Aunque ya se ha respondido, y la intención del autor es crear una aplicación de tipo de controlador frontal, pero estoy publicando una regla literal para el problema solicitado. si alguien tiene el problema por el mismo
RewriteEngine On
RewriteRule ^([^/]+)/([^/]+)/([/d]+)$ $1?id=$3 [L]
Más arriba debería funcionar para url picture.php/Some-text-goes-here/51
. sin usar un index.php como una aplicación de redirección.
Tengo una URL que se ve así:
url.com/picture.php?id=51
¿Cómo voy a convertir esa URL a:
picture.php/Some-text-goes-here/51
Creo que WordPress hace lo mismo.
¿Cómo hago para crear URL amigables en PHP?
Básicamente puede hacer esto de 2 maneras:
La ruta .htaccess con mod_rewrite
Agregue un archivo llamado .htaccess
en su carpeta raíz y agregue algo como esto:
RewriteEngine on
RewriteRule ^/?Some-text-goes-here/([0-9]+)$ /picture.php?id=$1
Esto le indicará a Apache que habilite mod_rewrite para esta carpeta, y si se le solicita una URL que coincida con la expresión regular, la reescribirá internamente según lo que desee, sin que el usuario final la vea. Fácil, pero inflexible, así que si necesitas más potencia:
La ruta de PHP
En su lugar, ponga lo siguiente en su .htaccess: (observe la barra diagonal)
FallbackResource /index.php
Esto le indicará que ejecute index.php
para todos los archivos que normalmente no puede encontrar en su sitio. Ahí puede, por ejemplo, por ejemplo:
$path = ltrim($_SERVER[''REQUEST_URI''], ''/''); // Trim leading slash(es)
$elements = explode(''/'', $path); // Split path on slashes
if(empty($elements[0])) { // No path elements means home
ShowHomepage();
} else switch(array_shift($elements)) // Pop off first item and switch
{
case ''Some-text-goes-here'':
ShowPicture($elements); // passes rest of parameters to internal function
break;
case ''more'':
...
default:
header(''HTTP/1.1 404 Not Found'');
Show404Error();
}
Así es como lo hacen los sitios grandes y los sistemas CMS, ya que permite mucha más flexibilidad para analizar URL, configuraciones y URL dependientes de bases de datos, etc. Para un uso esporádico, las reglas de reescritura codificadas en .htaccess
bien.
PHP no es lo que estás buscando, echa un vistazo a mod_rewrite
Si solo quieres cambiar la ruta de picture.php
entonces agregar la regla de reescritura en .htaccess
servirá a tus necesidades, pero, si quieres reescribir la URL como en Wordpress, entonces PHP es el camino. Aquí hay un ejemplo simple para comenzar.
Estructura de la carpeta
Hay dos archivos que se necesitan en la carpeta raíz, .htaccess
e index.php
, y sería bueno colocar el resto de los archivos .php
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
: habilite el motor de reescritura -
RewriteRule
: denegar el acceso a todos los archivos en la carpetainc/
, redirigir cualquier llamada a esa carpeta paraindex.php
-
RewriteCond
: permite el acceso directo a todos los demás archivos (como imágenes, css o scripts) -
RewriteRule
- redirecciona cualquier otra cosa aindex.php
index.php
Como todo ahora se redirige a index.php, se determinará si la URL es correcta, 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 requeridos 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 )
*/
}
}
El emparejamiento exitoso, ya que usamos subpatterns con nombre en regex, llene el $params
casi lo mismo que PHP llena el array $_GET
. Sin embargo, cuando se usa una url dinámica, la matriz $_GET
se completa sin ninguna comprobación de los parámetros.
/picture/some+text/51 Array ( [0] => /picture/some text/51 [text] => some text [1] => some text [id] => 51 [2] => 51 ) picture.php?text=some+text&id=51 Array ( [text] => some text [id] => 51 )
Estas pocas líneas de código y un conocimiento básico de expresiones regulares es suficiente para comenzar a construir un sólido sistema de enrutamiento.
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'' );
este es un archivo .htaccess que reenvía casi todo a index.php
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} !-l
RewriteCond %{REQUEST_FILENAME} !/.(ico|css|png|jpg|gif|js)$ [NC]
# otherwise forward it to index.php
RewriteRule . index.php
entonces depende de usted el análisis $ _SERVER ["REQUEST_URI"] y la ruta a picture.php o lo que sea