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?

¿Fue útil?

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:

  1. Ingrese "http://www.example.com/whatever.php" en su barra de direcciones
  2. Apache te redirige a "http://www.example.com/whatever/"
  3. Apache obtiene el URI lo que sea/ y aplica la primera regla y el URI se reescribe en /lo que sea.php
  4. El URI pasa nuevamente por el motor de reescritura
  5. la URI /lo que sea.php coincide con la segunda regla y redirige el navegador a "http://www.example.com/whatever/"
  6. 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top