Supongamos que tengo un archivo .htaccess en la raíz www de mi sitio web de Apache, por ejemplo, www.example.com .
Quiero lograr este efecto:
Cuando el usuario ingresa el enlace
www.example.com/dashboarden el navegador, en realidad mostrará contenido enwww.example.com/dashboard.phpY si el usuario ingresa directamente el enlace
www.example.com/dashboard.phpen el navegador, mostrará un error.
Probé el siguiente código .htaccess :
RewriteEngine on # this is to deny direct access of php files in browser # that is, when the user input directly 'www.example.com/dashboard.php' it will turn to error RewriteRule \.php$ - [F,L] # if the link the user input to the browser does not end with .php, the code will go down ahead # this rewrite 'www.example.com/dashboard' to 'www.example.com/dashboard.php' RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L,END] Sin embargo, esto hará que www.example.com/dashboard también sea inaccesible desde el navegador.
Si elimino la RewriteRule \.php$ - [F,L] , todo funciona bien, pero el usuario aún puede ingresar www.example.com/dashboard.php en el navegador para acceder directamente a la página php.
Todavía estoy confundido sobre cómo Apache procesa realmente los archivos .htaccess .
¿Es ese un flujo que ejecuta el código desde el principio hasta el final línea por línea? ¿O algo mas?
ACTUALIZAR
Y esto me da ERR_TOO_MANY_REDIRECTS :
RewriteEngine on RewriteRule ^/?(.+)\.php$ /$1 [R=301] RewriteCond %{REQUEST_FILENAME} !\.php$ RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^/?(.+)$ /$1.php [END]Estoy bastante confundido, ¿alguien puede ayudarme a explicar por qué esto da demasiados redireccionamientos?
De hecho, el servidor apache http procesa los archivos de configuración de arriba a abajo. Eso también es válido para los archivos de configuración distribuidos (".htaccess"), si están habilitados ...
Puede simplificar su enfoque:
RewriteEngine on RewriteRule \.php$ - [F,L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule !.*\.php$ %{REQUEST_URI}.php [END]Una variante, más fácil de leer:
RewriteEngine on RewriteRule \.php$ - [F,L] RewriteCond %{REQUEST_FILENAME} !\.php$ RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^/?(.+)$ /$1.php [END] Nota: hay una diferencia entre REQUEST_FILENAME y REQUEST_URI . El indicador QSA no se requiere aquí ya que es el predeterminado. Y L y END realmente no tienen sentido juntos (recuerde: END es la nueva L ...).
En lugar de denegar las solicitudes que aún tienen el nombre de archivo .php , debe redirigirlas:
RewriteEngine on RewriteRule ^/?(.+)\.php$ /$1 [R=301] RewriteCond %{REQUEST_FILENAME} !\.php$ RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^/?(.+)$ /$1.php [END]Es una buena idea comenzar con una redirección temporal 302 y solo cambiarla a una redirección permanente 301 más tarde, una vez que esté seguro de que todo está configurado correctamente. Eso evita problemas de almacenamiento en caché al probar cosas...
En caso de que reciba un error interno del servidor (estado de http 500) utilizando la regla anterior, lo más probable es que opere una versión muy antigua del servidor http de apache. En ese caso, verá una indicación clara de un indicador [END] no admitido en el archivo de registro de errores de su servidor http. Puede intentar actualizar o usar el indicador [L] más antiguo, probablemente funcionará igual en esta situación, aunque eso depende un poco de su configuración.
Esta implementación funcionará igualmente en la configuración del host de los servidores http o dentro de un archivo de configuración distribuido (archivo ".htaccess"). Obviamente, el módulo de reescritura debe cargarse dentro del servidor http y habilitarse en el host http. En caso de que utilice un archivo de configuración distribuido, debe tener cuidado de que su interpretación esté habilitada en la configuración del host y que esté ubicado en la carpeta DOCUMENT_ROOT del host.
Y una observación general: siempre debe preferir colocar tales reglas en la configuración del host de los servidores http en lugar de usar archivos de configuración distribuidos (".htaccess"). Esos archivos de configuración distribuidos agregan complejidad, a menudo son la causa de un comportamiento inesperado, difíciles de depurar y realmente ralentizan el servidor http. Solo se proporcionan como última opción para situaciones en las que no tiene acceso a la configuración de host de los servidores http reales (léase: proveedores de servicios realmente baratos) o para aplicaciones que insisten en escribir sus propias reglas (lo que es una pesadilla de seguridad obvia).