rewriterule htaccess example ejemplos domain php .htaccess url mod-rewrite url-rewriting

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:

  1. RewriteEngine : habilite el motor de reescritura
  2. RewriteRule : denegar el acceso a todos los archivos en la carpeta inc/ , redirigir cualquier llamada a esa carpeta para index.php
  3. RewriteCond : permite el acceso directo a todos los demás archivos (como imágenes, css o scripts)
  4. RewriteRule - redirecciona cualquier otra cosa a index.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