Negocjacja pliku Apache nie powiodła się

23

Mam następujący problem na hoście korzystającym z Apache 2.2.22 + PHP 5.4.0

Muszę dostarczyć plik, /home/server1/htdocs/admin/contents.phpgdy użytkownik http://server1/admin/contentswysyła żądanie :, ale otrzymuję ten komunikat na serwerze dziennik błędów.

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

Zauważ, że mam mod_negotiationwłączone i MultiViews wśród opcji dla powiązanego wirtualnego hosta:

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

Korzystam również mod_rewritez następujących .htaccesszasad:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

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

Wydaje się to bardzo dziwne, ale działało poprawnie na tym samym pudełku z PHP 5.3.6. Właśnie próbuję uaktualnić do PHP 5.4.0, ale nie mogę rozwiązać tego problemu negocjacyjnego. Każdy pomysł na to, dlaczego Apache nie może się równać, contents.phpgdy pyta content(co powinno być tym, co powinna zrobić mod_negotiation)?

AKTUALIZACJA: Zauważyłem, że mod_negotiation działa poprawnie z plikami o rozszerzeniu innym niż .php: więc jeśli miałbym plik o nazwie /admin/contents.txt, mogę uzyskać do niego regularny dostęp za pomocą przeglądarki z / admin / content url. Problem dotyczy tylko plików php. Wszelkie wskazówki, co może sprawić, że negocjacje się nie powiodą?

lorenzo.marcon
źródło
Jak skonfigurować mod_negotiation? Używasz tego?
Mircea Vutcovici
Cóż, po prostu dołączam mod_negotiation do httpd.conf, wtedy opcje MultiViews w VirtualHost powinny wystarczyć do zrobienia tego, czego szukam, o ile wiem ... prawda?
lorenzo.marcon
3
FWIW, miałem problem z +MultiViewswłączeniem i zniknął po wyłączeniu.
Felix Frank

Odpowiedzi:

39

Znalazłem rozwiązanie. Rzeczywiście bardzo łatwe. Zapomniałem dołączyć następujące informacje:

AddType application/x-httpd-php .php

do sekcji mod_mime apache do httpd.conf

Byłem wprowadzony w błąd przez fakt, że skrypty php działały poprawnie; jednak negocjacja nie powiodła się, ponieważ mod_negotiation szuka tylko „interesujących” (i znanych) typów plików.

lorenzo.marcon
źródło
3
To! Właśnie tak TUTAJ! Większość nocy spędziłem na szukaniu, dlaczego otrzymałem bardzo nieprzydatny błąd „Discovery File (s) / None Negotiation”. Skrypty działały wcześniej dobrze i miałem diabła czasu, śledząc fakt, że ten typ nie był uwzględniony w mod_mime w dystrybucji, na której testowałem. Jestem panu winien piwo.
Akoi Meexx,
Z przyjemnością przyjmę twoje piwo, kiedy przybędę do USA :)
lorenzo.marcon,
to działa idealnie !! @ lorenzo.marcon dzięki za pytanie i odpowiedź!
rogcg
To musiało się kiedyś zmienić. Jestem pewien, że nie musiałem dodawać tego wcześniej, aby php MultiViews działał.
user1338062,
Dzięki tonie metrycznej! Uderzyłem głową w ścianę, zastanawiając się, dlaczego mój mod przepisał z search /? $ Na search.php. Wygląda na to, że moduł negocjacyjny ma pierwszeństwo przed modułem przepisywania, co ogólnie dobrze jest wiedzieć.
us
12

Miałem ten sam problem po aktualizacji z Debian Squeeze do Wheezy. mods-enabled/mime.confObejmuje znanych typów plików z systemu:

TypesConfig /etc/mime.types

Problem polegał na tym, że /etc/mime.typesplik został zastąpiony przez aktualizację, aw zastąpionym pliku część PHP została skomentowana. Podczas szukania znalazłem:

#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

Musiałem usunąć #z każdego wiersza zawierającego rzeczy związane z php, a następnie zapisać i zrestartować serwer WWW Apache. To rozwiązało problem bez modyfikowania mime.confpliku.

derHippeChip
źródło
To uratowało mnie po 4 godzinach niekończącego się debugowania z duchem.
MarkSkayff,
Pamiętaj, że zrobienie tego może spowodować, że libapache-mod-php5pliki .phpzostaną wykonane w nazwie (jak filename.php.jpeg), co było oryginalnym uzasadnieniem ich komentowania. Zobacz bugs.debian.org/589384
Kevinoid
0

Zamiast mapowania .phpna typ nośnika (który może mieć wpływ na bezpieczeństwo, jak opisano w Debian Bug 589384, który je wyłączył), możesz skonfigurować MultiviewsMatchdopasowanie plików bez typu .php, jak sugeruje odpowiedź Marka na podobne pytanie :

<Files "*.php">
    MultiviewsMatch Any
</Files>
Kevinoid
źródło