La negociación del archivo Apache falló

23

Tengo el siguiente problema en un host que usa Apache 2.2.22 + PHP 5.4.0

Necesito proporcionar el archivo /home/server1/htdocs/admin/contents.phpcuando un usuario realiza la solicitud: http://server1/admin/contentspero obtengo este mensaje en el servidor error_log.

Negotiation: discovered file(s) matching request: /home/server1/htdocs/admin/contents (None could be negotiated)

Tenga en cuenta que he mod_negotiationhabilitado y MultiViews entre las opciones para el host virtual relacionado:

<Directory "/home/server1/htdocs">
    Options Indexes Includes FollowSymLinks MultiViews
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

También uso mod_rewrite, con las siguientes .htaccessreglas:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^\./]*)$ index.php?t=$1 [L]
</IfModule>

Parece muy extraño, pero en el mismo cuadro con PHP 5.3.6 solía funcionar correctamente. Solo estoy intentando una actualización a PHP 5.4.0, pero no puedo resolver este problema de negociación. ¿Alguna idea de por qué Apache no puede coincidir contents.phpcuando se solicita content(que debería ser lo que se supone que debe hacer mod_negotiation)?

ACTUALIZACIÓN: Noté que mod_negotiation se comporta correctamente con archivos con una extensión diferente a .php: así que si tuviera un archivo llamado /admin/contents.txt, puedo acceder regularmente con el navegador con / admin / contents url. Entonces, el problema es solo para los archivos php. ¿Alguna pista sobre qué podría hacer fracasar la negociación?

lorenzo.marcon
fuente
¿Cómo se configura mod_negotiation? ¿Lo estás usando?
Mircea Vutcovici
Bueno, solo incluyo mod_negotiation en httpd.conf, luego las opciones de MultiViews en VirtualHost deberían ser suficientes para hacer lo que estoy buscando, por lo que sé ... ¿no es así?
lorenzo.marcon
3
FWIW, tuve este problema con +MultiViewshabilitado, y desapareció al deshabilitarlo.
Felix Frank

Respuestas:

39

Encontré la solución. Muy fácil, de hecho. Olvidé incluir lo siguiente:

AddType application/x-httpd-php .php

en la sección apache mod_mime en httpd.conf

Me engañó el hecho de que los scripts php funcionaban correctamente; sin embargo, la negociación estaba fallando porque mod_negotiation solo busca tipos de archivos "interesantes" (y conocidos).

lorenzo.marcon
fuente
3
¡Esta! Esta justo AQUI! Pasé la mayor parte de la noche buscando por qué recibía el muy inútil error "Archivos descubiertos / Ninguno negociado". Las secuencias de comandos habían estado funcionando bien antes, y tuve un mal tiempo rastreando el hecho de que el tipo no estaba incluido en mod_mime en la distribución en la que estaba probando. Le debo una cerveza señor.
Akoi Meexx
Con mucho gusto aceptaré tu cerveza cuando venga a EE. UU. :)
lorenzo.marcon
esto funciona perfectamente !! @ lorenzo.marcon gracias por la pregunta y respuesta!
rogcg
Esto debe haber cambiado en algún momento. Me siento bastante seguro de que no necesité agregar esto antes para que php MultiViews funcione.
user1338062
Gracias una tonelada métrica! Estaba golpeando mi cabeza contra la pared, preguntándome por qué mi mod reescritura de search /? $ To search.php no estaba funcionando. Parece que el módulo de negociación tiene prioridad sobre el módulo de reescritura, que generalmente es bueno saber.
zɐɟəʇəs u Octs
12

Tuve el mismo problema después de actualizar Debian Squeeze a Wheezy. La mods-enabled/mime.confincluye los tipos de archivos conocidos del sistema:

TypesConfig /etc/mime.types

El problema fue que el /etc/mime.typesarchivo fue reemplazado por la actualización y en el archivo reemplazado, la parte PHP fue comentada. Al buscarlo, encontré:

#application/x-httpd-php                        phtml pht php
#application/x-httpd-php-source                 phps
#application/x-httpd-php3                       php3
#application/x-httpd-php3-preprocessed          php3p
#application/x-httpd-php4                       php4
#application/x-httpd-php5                       php5

Tuve que eliminar el #de cada línea que contenía material relevante para php, luego guardar y reiniciar el servidor web Apache. Eso resolvió el problema sin modificar el mime.confarchivo.

derHippeChip
fuente
Esto me salvó después de 4 horas de depuración interminable contra un fantasma.
MarkSkayff
Tenga en cuenta que hacer esto podría hacer que se libapache-mod-php5ejecuten archivos con .phpel nombre (como filename.php.jpeg), que era la razón original para comentarlos. Ver bugs.debian.org/589384
Kevinoid