Falha na negociação do arquivo Apache

23

Estou tendo o seguinte problema em um host usando o Apache 2.2.22 + PHP 5.4.0

Preciso fornecer o arquivo /home/server1/htdocs/admin/contents.phpquando um usuário faz a solicitação http://server1/admin/contents:, mas recebo esta mensagem no servidor error_log.

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

Observe que eu mod_negotiationhabilitei e MultiViews entre as opções para o host virtual relacionado:

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

Eu também uso mod_rewrite, com as seguintes .htaccessregras:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

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

Parece muito estranho, mas na mesma caixa do PHP 5.3.6 costumava funcionar corretamente. Estou apenas tentando uma atualização para o PHP 5.4.0, mas não consigo resolver esse problema de negociação. Alguma idéia de por que o Apache não pode corresponder contents.phpao pedir content(qual deveria ser o que a negociação de modificação deveria fazer)?

ATUALIZAÇÃO: Percebi que a negociação de mod_nós se comporta corretamente com arquivos com extensão diferente de .php: por isso, se eu tiver um arquivo chamado /admin/contents.txt, posso acessá-lo regularmente com o navegador com / admin / contents url. Portanto, o problema é apenas para arquivos php. Alguma pista sobre o que poderia fazer a negociação falhar?

lorenzo.marcon
fonte
Como você configura a negociação de modificação? Você está usando?
Mircea Vutcovici 23/03
Bem, eu apenas incluí mod_negotiation no httpd.conf, então as opções MultiViews no VirtualHost devem ser suficientes para fazer o que estou procurando, tanto quanto sei ... não é?
Lorenzo.marcon 23/03
3
FWIW, eu tive esse problema com +MultiViewsativado, e ele desapareceu ao desativá-lo.
Felix Frank

Respostas:

39

Eu encontrei a solução. Muito fácil mesmo. Esqueci de incluir o seguinte:

AddType application/x-httpd-php .php

na seção apache mod_mime em httpd.conf

Eu fui enganado pelo fato de que os scripts php estavam funcionando corretamente; no entanto, a negociação falhou porque mod_negotiation somente procura por tipos de arquivos "interessantes" (e conhecidos).

lorenzo.marcon
fonte
3
Este! Isso aqui! Passei a maior parte da noite procurando por que eu estava recebendo o erro "Arquivo (s) Descoberto (s) / Nenhum Negociado" (inútil). Os scripts estavam funcionando bem antes, e eu demorava um tempo rastreando o fato de que o tipo não estava sendo incluído no mod_mime na distribuição em que eu estava testando. Te devo uma cerveja, senhor.
Akoi Meexx
Aceitarei com prazer a sua cerveja quando for para os EUA :) #
31413 lorenzo.marcon
isso funciona perfeitamente !! @ lorenzo.marcon obrigado pela pergunta e resposta!
rogcg
Isso deve ter mudado em algum momento. Estou me sentindo bastante confiante de que não precisei adicionar isso antes para o php MultiViews funcionar.
user1338062
Graças uma tonelada métrica! Eu estava batendo minha cabeça contra a parede, me perguntando por que meu mod reescreveu de search /? $ Para search.php não estava funcionando. Parece que o módulo de negociação tem precedência sobre o módulo de reescrita, o que geralmente é bom saber.
Ziəs dez
12

Eu tive o mesmo problema depois de atualizar o Debian Squeeze para o Wheezy. Isso mods-enabled/mime.confinclui os tipos de arquivos conhecidos do sistema:

TypesConfig /etc/mime.types

O problema era que o /etc/mime.typesarquivo foi substituído pela atualização e, no arquivo substituído, a parte do PHP foi comentada. Ao procurá-lo, encontrei:

#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

Eu tive que remover o #de cada linha contendo material relevante para php, salvar e reiniciar o servidor da web Apache. Isso resolveu o problema sem modificar o mime.confarquivo.

derHippeChip
fonte
Isso me salvou após 4 horas de depuração sem fim contra um fantasma.
MarkSkayff
Esteja ciente de que fazer isso pode tornar os libapache-mod-php5arquivos executados .phpno nome (como filename.php.jpeg), que era a lógica original para comentá-los. Veja bugs.debian.org/589384
Kevinoid em