2009-07-01 9 views
8

Estoy tratando de armar algún código de htaccess que convertirá example.com/filename.php en example.com/filename/ (y forzar la barra) - He intentado varios enfoques, pero cada uno ha funcionó correctamente, desde 500 errores en subcarpetas hasta problemas con la barra al final, etc ...código htaccess para eliminar la extensión Y agregar + fuerza barra inclinada?

¡Ayuda!

+1

Usted en realidad no han mencionado los enfoques que ha intentado - ¿Cuáles son sus conjunto actual de reglas de reescritura (suponiendo estás usando mod_rewrite)? Si no estás usando mod_rewrite, ¿qué estás usando? –

+0

RewriteRase ^() $ index.php [NC, L] Rewritecond% {REQUEST_URI}! (^ /?. * \ .. * $) [NC] RewriteRule^(. *) $ $ 1.php [NC] Actualmente funciona bien para eliminar la extensión .php de los archivos, independientemente de la profundidad de la carpeta. Sin embargo, agregar a/resulta en un error 404, y todos los intentos de integrar una solución de barra forzada han causado problemas. –

+0

Acepte una respuesta, esta pregunta también está vinculada a otras preguntas. –

Respuesta

0

Puede intentar resolver la pregunta here. Si bien la solución a la pregunta no es relevante (aún ...) la pregunta en sí proporciona un conjunto de reglas de reescritura que puede usar en su propio sitio.

Si necesita símbolos en las URL, puede usar ". *" En lugar del A-Za-z0-9 específico, pero si está buscando una posible barra al final, puede usar ". *? " en lugar. Esta es una característica de expresión regular estándar para evitar la codicia de ". *".

+0

Hmm. Eso ayudó un poco, y se está conducen a mí ahora usando: RewriteCond% {} -d REQUEST_FILENAME RewriteCond% {REQUEST_FILENAME} \ php -f RewriteRule^([^ /] +)/$ $ 1.php . # obliga a ser añadido RewriteCond% {} REQUEST_FILENAME! -f RewriteCond% {} REQUEST_FILENAME! -d RewriteCond% {} REQUEST_URI! (\ barra al final. [a-zA-Z0-9] {1,5 } | /) $ RewriteRule (. *) $/$ 1/[R = 301, L] Esto funciona perfectamente (tiras .php. Y fuerza una barra inclinada), excepto cuando está en un subdirectorio, cuando da un 404 error :( –

+0

! (\. [a-zA-Z0-9] {1,5} | /) $ probablemente debería ser! (([a-zA-Z0-9] /?) +) $. Si No estoy equivocado que coincidirá todos los caracteres alfanuméricos seguidos por un "/" (opcional), y coinciden esa o más veces. –

2
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^([^/]+)/$ $1.php 
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule (.*)$ /$1/ [R=301,L] 

Funciona como un encanto - gracias por la ayuda gente.

+0

¿Es esta la solución? No ha sido seleccionado como una respuesta .... – Angela

13

Prueba esto:

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php 
RewriteRule (.*)\.php$ /$1/ [L,R=301] 

RewriteRule (.*)/$ $1.php [L] 

La primera regla redirige las peticiones de /foo/bar.php externamente para /foo/bar/. Y la segunda regla reescribe las solicitudes de /foo/bar/ internos a /foo/bar.php.

Y para forzar la barra final, prueba esta regla:

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .*[^/]$ $0/ [L,R=301] 
6

Esta solución de Gumbo funciona muy bien para archivos, sin embargo, no funciona con directorios. En otras palabras:

Para mysite.com/file1.php, muestra mysite.com/file1/, que es excelente. Sin embargo, no funciona bien para directorios. Si intento acceder a la siguiente directorio (que contiene el archivo index.php dentro) mysite.com/dir1, en lugar de mostrar el contenido de la http:/mysite.com/dir1/index.php y la url: mysite.com/dir1/, devuelve 404.

Mi solución era alrededor de ella:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php 
RewriteRule (.*)\.php$ /$1/ [L,R=301] 


RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule (.*)/$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule .*[^/]$ $0/ [L,R=301] 

En otras palabras, no hacer nada si es un directorio.

Espero que ayude.

Otro problema con la solución original es que css y las imágenes no se cargan hasta que cambie la ruta al archivo css y las imágenes a la ruta absoluta.

¿Hay alguna otra manera de resolverlo, en lugar de cambiar todas las rutas en todos los archivos en el sitio web a absoluto.

Muchas gracias.

+0

Esto no responde a la pregunta de Jono Alderson. Por favor abre una nueva pregunta. – Gumbo

0

Para la ruta, puede agregar <base href="yourpath" /> a sus páginas php.

0

Prueba de esto, éste funciona en mi Apache, aunque se extraigan manual de la última barra:

Options +FollowSymLinks -MultiViews 
RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php 
RewriteRule (.*)\.php$ /$1/ [L,R=301] 
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$ 
RewriteRule (.*)$ /$1/ [R=301,L] 
Cuestiones relacionadas