.htaccess mod_rewrite enlazando a una página incorrecta
-
09-12-2019 - |
Pregunta
Tengo en mi .htaccess el siguiente código:
RewriteEngine On
RewriteRule ^/?([^/\.]+)/?$ $1.php [L]
RewriteRule ^/?([^/\.]+).php$ $1/ [R,L]
RewriteRule ^/?([^/\.]+)/?$ $1.php [L]
está funcionando bien.Lo que esto hace es tomar una URL como http://www.example.com/whatever
y hacer que lea la página como http://www.example.com/whatever.php
.
Sin embargo, lo que me gustaría poder hacer es tomar una URL como http://www.example.com/whatever.php
y enviarlo automáticamente a http://www.example.com/whatever
, de ahí la segunda línea del código.Sin embargo, esto no funciona.Lo que está haciendo ahora es tan pronto como encuentra un enlace que termina en .php
, la URL se convierte http://localhost/C:/Sites/page/whatever/
, y tirando de un 403: Forbidden
página.
Lo único que quiero saber es qué puedo hacer para que http://www.example.com/whatever.php
se leerá como http://www.example.com/whatever
, y que si http://www.example.com/whatever.php
se ingresa en la barra de URL, se redirigirá automáticamente a http://www.example.com/whatever
.
¿Tiene eso algún sentido?
EDITAR
Ok, parece que no lo tenía muy claro...básicamente quiero /whatever/
leer como whatever.php
mientras que la URL aún permanece como /whatever/
, ¿bien?Sin embargo, si la URL era /whatever.php
, quiero que realmente redirigir la URL de los usuarios a /whatever/
, y luego una vez más léelo como whatever.php
.es posible?
Solución
Si sus reglas están dentro de un archivo .htaccess, puede omitir la barra diagonal inicial cuando compare con un URI:
RewriteRule ^([^/\.]+)/?$ /$1.php [L]
También tenga en cuenta que se incluye una barra diagonal inicial en el destino (/$1.php
), esto asegura /lo que sea/ se reescribe a /lo que sea.php.Cuando redirige, si le falta esta barra diagonal, Apache le antepone la raíz del documento.De este modo /lo que sea.php se redirige a la raíz del documento C:/Sitios/página/lo que sea/.Incluso si incluyes la barra diagonal inicial, esto nunca funcionará porque provocarás un bucle de redireccionamiento:
- Ingrese "http://www.example.com/whatever.php" en su barra de direcciones
- Apache te redirige a "http://www.example.com/whatever/"
- Apache obtiene el URI lo que sea/ y aplica la primera regla y el URI se reescribe en /lo que sea.php
- El URI pasa nuevamente por el motor de reescritura
- la URI /lo que sea.php coincide con la segunda regla y redirige el navegador a "http://www.example.com/whatever/"
- repita los pasos 3-5
Es necesario agregar una condición de que el solicitud real es para /lo que sea.php:
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php
RewriteRule ^ /%2/ [R,L]
Entonces, en total, tendrás:
RewriteEngine On
RewriteRule ^([^/\.]+)/?$ /$1.php [L]
RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /([^/\.]+)\.php
RewriteRule ^ /%2/ [R,L]
Otros consejos
Estás realizando una sustitución de ruta relativa en un contexto por directorio (.htaccess
es un contexto por directorio).Esto requiere RewriteBase
.Las reescrituras por directorio se realizan en una etapa posterior del procesamiento, cuando las URL se han asignado a rutas.Pero la reescritura debe producir una URL, que se procesa nuevamente.creo que sin el RewriteBase
para proporcionar el prefijo de URL, terminará con un prefijo de sistema de archivos en lugar de la URL.Quizás por eso estás recibiendo el C:/Sites
cosa.Intentar RewriteBase
.Pero después de una correcta RewriteBase
para especificar el prefijo de URL correcto que se agregará delante de la parte relativa reescrita, me temo que tendrás el bucle de reescritura, porque estás reescribiendo whatever.php
a whatever
;y whatever
a whatever.php
.
Referencia: http://httpd.apache.org/docs/current/rewrite/tech.html