php - ejemplo - ¿Cómo puedo crear URL amigables con.htaccess?
url amigables php mvc (8)
Acabo de probar esto localmente y parece hacer lo que necesita:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/.]+)(?:/)?$ /index.php?ctrl=$1 [L]
RewriteRule ^([^/.]+)/([^/.]+)(?:/)?$ /index.php?ctrl=$1&id=$2 [L]
RewriteRule ^([^/.]+)/([^/.]+)/([^/.]+)(?:/.*)?$ /index.php?ctrl=$1&id=$2&tab=$3 [L]
</IfModule>
Esto es lo que hace:
- Para una ruta como http://website.com/pelicula/ , redirigir a /index.php?ctrl=pelicula
- Para una ruta como http://website.com/pelicula/0221889 , redirigir a /index.php?ctrl=pelicula&id=0221889
- Para una ruta como http://website.com/pelicula/0221889/posters/ , redirigir a /index.php?ctrl=pelicula&tab=posters
- Para una ruta como http://website.com/pelicula/0221889/posters/anything-can-go-here , redirigir a /index.php?ctrl=pelicula&tab=posters e ignorar el resto de la ruta.
Estas reescrituras funcionarán con o sin una barra inclinada: si desea que funcionen solo sin la barra, elimine (?:/)?
desde el final de las dos primeras reescrituras. También puede usar mod_rewrite para agregar o eliminar una barra inclinada final según sea necesario.
Estoy teniendo un momento difícil con .htaccess. Quiero crear URL amigables para un sitio en el que estoy trabajando ...
Básicamente quiero convertir esto:
http://website.com/index.php?ctrl=pelicula&id=0221889
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters
Dentro de esto:
http://website.com/pelicula/0221889/
http://website.com/pelicula/0221889/posters/
En caso de que lo necesite más tarde, también me gustaría saber cómo agregar el título del artículo al final de la URL de esta manera (estoy usando PHP):
http://website.com/pelicula/0221889/the-article-name/
http://website.com/pelicula/0221889/the-article-name/posters/
Nota: El método Stackoverflow también es bueno para mí, por ejemplo, la URL de esta pregunta es:
http://stackoverflow.com/questions/3033407/htacces-to-create-friendly-urls-help-needed
Pero puedes poner cualquier cosa después de la identificación y también funcionará. Me gusta esto:
http://stackoverflow.com/questions/3033407/just-anything-i-want
He usado algunas herramientas web automáticas para crear el archivo .htacces, pero no funciona correctamente. Entonces le pido su ayuda.
También me alegrará si puede recomendar las mejores prácticas y recomendaciones de .htacces.
EDITAR: basado en algunas respuestas que obtengo aquí pongo esto:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
</IfModule>
Pero recibo el error predeterminado de "página no encontrada" del host.
También probé:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/(/d+)/([^/]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
RewriteRule ^([^/]+)/(/d+)/?$ index.php?ctrl=$1&id=$2 [QSA,L]
RewriteRule ^([^/]+)/?$ index.php?ctrl=$1 [QSA,L]
</IfModule>
Esto tampoco funciona. Me lleva a mi página predeterminada 404.php.
mod_rewrite está habilitado y funcionando.
¡Ayuda!
Asegúrese de no tener ningún otro archivo .htaccess más arriba en el árbol de directorios que esté en conflicto con el .htaccess de su sitio.
El primero suponiendo que su archivo .htaccess está en la raíz:
RewriteRule ^([a-zA-Z]+)/([0-9]+)(/)?$ index.php?ctrl=$1&id=$2
El segundo:
RewriteRule ^([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)(/)?$ index.php?ctrl=$1&id=$2&tab=$3
o si siempre son posters
lugar de pestañas diferentes:
RewriteRule ^([a-zA-Z]+)/([0-9]+)/posters(/)?$ index.php?ctrl=$1&id=$2&tab=posters
Agregué el (/)?
lo que debería significar que el URI funcionará con o sin barra final.
En cuanto a la otra, probablemente siempre mantendría el artículo al final para que vuelva a escribir o añada otro /value
para que la reescritura sepa la diferencia entre la pestaña y el artículo, o excluya los guiones de la expresión regular.
En función de la experiencia, recomendaría ajustar su esquema de URI para que sea más fácil aplicar únicamente la regla a los URI que SABE que se vuelven a escribir. Por ejemplo
Convertir esto:
http://website.com/index.php?ctrl=pelicula&id=0221889
http://website.com/index.php?ctrl=pelicula&id=0160399&tab=posters
En esto (he puesto la palabra "cosas", pero esto realmente debería ser algo que describa lo que es probable que encuentres, es decir, "comprar" o "biblioteca" o lo que sea que este contenido sea):
http://website.com/stuff/pelicula/0221889/
http://website.com/stuff/pelicula/0221889/posters/
Para lograr esto, debe colocar un archivo .htaccess en la carpeta de nivel superior de su sitio web que contenga las siguientes reglas:
RewriteEngine on
RewriteRule ^stuff/([^//.]+)/([^//.]+)/([^//.]+)/?$ index.php?ctrl=$1&id=$2&tab=$3 [L,NC,QSA]
RewriteRule ^stuff/([^//.]+)/([^//.]+)/?$ index.php?ctrl=$1&id=$2 [L,NC,QSA]
Al tener la parte de "cosas" de la dirección (renombrada a algo apropiado), no reescribirá accidentalmente otros activos, como imágenes, CSS includes y JavaScript includes.
Como nota al margen, has mencionado:
Esto tampoco funciona. Me lleva a mi página predeterminada 404.php.
¿Dónde se declara la redirección de error 404?
En la raíz del documento para http://website.com/
pondría un archivo htaccess
como este:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
Luego, en su script PHP puede manipular la $_GET[''url'']
como lo desee:
$path_components = explode(''/'', $_GET[''url'']);
$ctrl=$path_components[0];
$id=$path_components[1];
$tab=$path_components[2];
Para tener esta url:
http://website.com/pelicula/0221889/posters
reescrito a esto:
http://website.com/index.php?ctrl=pelicula&id=0221889&tab=posters
Yo haría esto:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L]
</IfModule>
Tienes que elegir si quieres poner el título después de la identificación y hacerlo todo el tiempo, porque la variable de pestaña está en la última posición: debes saber si será el número 3 o el número 4. Si haces esto :
RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)$ index.php?ctrl=$1&id=$2&tab=$4 [QSA,L]
el tercer paréntesis no se captura y, por lo tanto, puede contener cualquier cosa.
Espero que ayude
RewriteRule ^ stuff /([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 & tab = $ 3 [L, NC , QSA] RewriteRule ^ stuff /([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 [L, NC, QSA]
Yo uso esto en mi archivo .htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* rewrite.php [L]
Básicamente, si no existe como un archivo o directorio, use rewrite.php y deje que eso se ocupe del análisis de URL, etc. Creo que es la forma más básica de reescribir.
Además, consulte los resultados de var_dump($_SERVER)
(en algún lugar que sepa que funciona) para ver si lo que usted piensa que es el directorio más alto realmente ES el directorio más alto, por ejemplo: puede estar escribiendo en /var/www/domain/www/index.php
lugar de /var/www/domain/index.php