Quiero atender todas las solicitudes de archivos no existentes a través de .php
Configuración de .htaccess
:
ErrorDocument 404 /index.php DirectoryIndex index.php RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L]
Esto parece funcionar principalmente, pero algunas extensiones de archivo específicas (.txt, .jpg, ¿algunas más?) son manejadas por apache en lugar de pasar a través de php.
http://localhost:8000/home -> muestra la página de inicio
http://localhost:8000/file.zip (no existe) -> muestra una página 404 con estilo personalizado servida por PHP
http://localhost:8000/exists.txt (archivo existente) -> sirve archivo existente
http://localhost:8000/doesnotexist.txt (no existe) -> muestra la página predeterminada de apache 404 (igual que cuando no está instalado PHP)
¿Hay algún controlador de apache predeterminado para extensiones de archivo específicas?
¿Cómo puedo configurar TODAS las solicitudes para que pasen a través de index.php?
Copié tu experimento con Docker y la imagen php 7.4-apache. Al abrir la url http://localhost:8000/doesnotexist.txt
, soy transferido al archivo index.php como esperaba. Las tres reglas de reescritura inferiores reescribirán todo en index.php.
En primer lugar: no ha publicado un docker-compose.yml
o Dockerfile
, así que para estar seguro: debe habilitar la reescritura para Apache mediante un comando en el dockerfile o un Dockerfile personalizado como este:
# Dockerfile FROM php:7.4-apache RUN a2enmod rewrite
Si no hubiera habilitado la reescritura, debería aparecer un error 500, porque no hay condiciones condicionales en torno a la regla de reescritura.
Si habilitó la reescritura, el comportamiento sigue siendo extraño, porque incluso si la línea ErrorDocument 404 /index.php
no está allí, la reescritura inferior debería hacer que index.php se sirva de todos modos. En otras palabras: las tres líneas inferiores en .htaccess
se asegurarían de que no se sirva ningún 404, porque todo se reescribe en index.php.
Cuando dices 'la página predeterminada de apache 404', ¿estás hablando de la página 'No encontrada'?
Not Found (H1 tag) The requested URL was not found on this server. Apache/2.4.52 (Debian) Server at localhost Port 8000
Intente eliminar y reconstruir el contenedor, de modo que ningún problema extraño de almacenamiento en caché pueda causar problemas.
¿Y qué hay de su index.php
. ¿Hay algo allí que pueda desencadenar algo extraño? ¿Podrías publicarlo aquí?
Pruebe esto en su archivo .htaccess (sin la parte ErrorDocument):
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ index.php?file=$0 [QSA,L]
Asegúrese de generar 404 si el código no encuentra el archivo.
¿Hay algún controlador de apache predeterminado para extensiones de archivo específicas?
No, no existe un controlador de este tipo de forma predeterminada.
¿Cómo puedo configurar TODAS las solicitudes para que pasen a través de index.php?
ErrorDocument 404 /index.php
es válido.DirectoryIndex index.php
es válidoRewriteEngine on
es válidoRewriteCond %{REQUEST_FILENAME} !-f
es válidoRewriteCond %{REQUEST_FILENAME} !-d
es válidoRewriteRule ^ index.php [L]
también es válido!Tenga en cuenta que no lo está reescribiendo en la raíz /index.php, sino que lo está reescribiendo sin la barra inclinada, y lo reescribe en index.php en el directorio actual. Entonces, si index.php no existe en el directorio actual, es probable que entre en un bucle infinito.
Tratar:
ErrorDocument /index.php DirectoryIndex index.php RewriteEngine On RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L] # use '/index.php' if needed to redirect to root index.php
Esto redirigirá que todo existe a index.php y evitará conflictos con ErrorDocument
.
Pero, creo que esto es lo que realmente quieres hacer:
ErrorDocument /index.php DirectoryIndex index.php # remove those rewrite rules