2010-06-13 33 views
10

Estoy teniendo un momento difícil con .htaccess. Quiero crear URLs amigables para un sitio que estoy trabajando ...¿Cómo puedo crear URL amigables con .htaccess?

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 

En 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 añadir el título del artículo hasta el final de la URL como esto (estoy usando PHP):

http://website.com/pelicula/0221889/the-article-name/ 
http://website.com/pelicula/0221889/the-article-name/posters/ 
No

E: 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 usted puede poner cualquier cosa después de la Identificación y también funcionará. de esta manera:

http://stackoverflow.com/questions/3033407/just-anything-i-want 

he utilizado algunas herramientas automáticas web para crear el archivo .htacces, pero no su trabajo correctamente. Entonces le pido su ayuda.

también me alegraré si se puede recomendar .htacces mejores prácticas y recomendaciones ..

EDIT: basado en algunas respuestas que llegar hasta 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 consigo el error "página no encontrada" del host predeterminado.

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 también no funciona. Me lleva a mi página predeterminada 404.php.

mod_rewrite está habilitado y funcionando.

¡Ayuda!

+0

http://stackoverflow.com/questions/2569725/getting-two-variables-in-the-url-with-htaccess/2569734#2569734 http://stackoverflow.com/questions/2088804/htaccess- confusing-clean-urls/2088854 # 2088854 http://stackoverflow.com/questions/2549408/needs-some-help-with-an-apache-mod-rewrite-issue/2549688#2549688 ... –

+1

Para ver cuál es tu Se están reescribiendo las URL, intente hacer eco de $ _GET en la parte superior de index.php o usar el registro de reescritura para depurar. http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritelog – cam8001

+0

¿Estás "realmente" seguro de que la reescritura funciona correctamente? Tuve los mismos problemas una vez con archivos de configuración de Apache mal configurados. http://www.webune.com/forums/how-to-test-check-if-mod-rewrite-is-enabled-t40.html realmente me ayudó – DrColossos

Respuesta

6

En la raíz del documento de http://website.com/ me gustaría poner un archivo htaccess así:

<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 variable $_GET['url'] a su gusto:

$path_components = explode('/', $_GET['url']); 
$ctrl=$path_components[0]; 
$id=$path_components[1]; 
$tab=$path_components[2]; 
+0

Necesito cambiar toda la aplicación web para usar esto? Quiero decir, ¿necesito cambiar todo $ _GET en cada página? – Jonathan

+1

@Jonathan: ¡No, ese es el objetivo! Solo tendrá ese código en la página index.php. Entonces index.php puede decidir qué hacer e incluir las páginas necesarias dependiendo de las variables $ _GET – nico

+0

Esto se conoce como Patrón de controlador frontal y en mi humilde opinión es el camino a seguir. –

0

El primero asumiendo su archivo .htaccess está en la raíz:

RewriteRule ^([a-zA-Z]+)/([0-9]+)(/)?$ index.php?ctrl=$1&id=$2 

La segunda:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/([a-zA-Z]+)(/)?$ index.php?ctrl=$1&id=$2&tab=$3 

o si siempre es posters en lugar de diferentes pestañas:

RewriteRule ^([a-zA-Z]+)/([0-9]+)/posters(/)?$ index.php?ctrl=$1&id=$2&tab=posters 

Agregué el (/)? que debería significar que el URI funcionará con o sin usted t raya al final.

cuanto a la otra lo que probablemente siempre mantenga el artículo al final por lo que la reescritura o agregar otro /value por lo que la reescritura sabe la diferencia entre la lengüeta y el artículo o excluir guiones de la expresión regular.

+0

genial, esta es la única línea que necesito poner dentro del archivo htacces? – Jonathan

0

Para tenga esta url:

http://website.com/pelicula/0221889/posters 

reescrito a esto:

http://website.com/index.php?ctrl=pelicula&id=0221889&tab=posters 

Me gustaría hacer esto:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?$ index.php?ctrl=$1&id=$2&tab=$3 [QSA,L] 
</IfModule> 

usted tiene que elegir si desea poner el título después de la Identificación y lo hace todo el tiempo, debido a la variable que se pestaña en la última posición: usted tiene que saber si va a ser el número 3 o número 4. Si hace esto:

RewriteRule ^/([^/]+)/([^/]+)/?([^/]*)/?([^/]*)$ index.php?ctrl=$1&id=$2&tab=$4 [QSA,L] 

la tercera paréntesis no se captura, y por lo tanto puede contener cualquier cosa.

Esperamos que ayuda

+0

Puse esto en el archivo .htacces pero no funciona, ¿alguna idea de por qué? – Jonathan

+0

Bueno, ¿qué rey de eeor obtienes? ¿Tiene mod_rewrite habilitado? – jfoucher

+0

sí, todo está habilitado. Simplemente no encuentra la página ... – Jonathan

7

acabo de probar este local y parece que 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:

Estos reescrituras trabajarán con o sin barra final - si usted quiere que trabajen solamente sin la barra, retire la (?:/)? desde el final de los dos primeros reescrituras. También puede usar mod_rewrite para agregar o eliminar una barra inclinada final según sea necesario.

+0

No funciona en mi servidor web. Me sale este error: Error interno del servidor. El servidor encontró un error interno o una configuración incorrecta y no pudo completar su solicitud. ¿Alguna idea? – Jonathan

+0

Intenta eliminar la barra desde delante de index.php en todas las reglas de reescritura. – cam8001

+0

Quité las barras, el mismo error.Creo que podría ser un error de sintaxis porque cuando probé el código proporcionado por 'jfoucher' no entiendo este problema ... – Jonathan

0

Asegúrese de que no tiene ningún otro archivo .htaccess más arriba en el árbol del directorio que está en conflicto con el .htaccess de su sitio.

0

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 un directorio, el uso rewrite.php y dejar que se encargan de analizar el URL etc. Es decir que creo la forma más básica de reescribir.

Además, echa un vistazo a los resultados de var_dump($_SERVER) (en algún lugar se sabe que funciona) para ver si lo que cree que es el directorio superior realmente es el directorio superior, por ejemplo: se puede writiting a /var/www/domain/www/index.php en lugar de /var/www/domain/index.php

0

Based En la experiencia, recomendaría ajustar su esquema de URI para que sea más fácil aplicar solo 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 en realidad debería ser algo que describe lo que es probable que encuentre, es decir, "comprar" o " biblioteca" o lo que este contenido es):

http://website.com/stuff/pelicula/0221889/ 
http://website.com/stuff/pelicula/0221889/posters/ 

Para lograr esto, se pondría un archivo .htaccess en la carpeta de nivel superior de su sitio web que contiene 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, incluye CSS y JavaScript.

Como nota al margen, usted ha mencionado:

This also does not work. It takes me to my default 404.php page.

Si se declara su redirección de error 404?

0

RewriteRule^cosas /([^/.]+)/([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 & pestaña = $ 3 [L, NC, QSA] RewriteRule^stuff /([^/.]+)/([^/.]+)/?$ index.php? Ctrl = $ 1 & id = $ 2 [L, NC, QSA]

Cuestiones relacionadas