การเจรจาไฟล์ Apache ล้มเหลว


23

ฉันมีปัญหาดังต่อไปนี้ในโฮสต์ที่ใช้ Apache 2.2.22 + PHP 5.4.0

ฉันต้องการให้ไฟล์/home/server1/htdocs/admin/contents.phpเมื่อผู้ใช้ทำการร้องขอ: http://server1/admin/contentsแต่ฉันได้รับข้อความนี้บนเซิร์ฟเวอร์ error_log

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

ขอให้สังเกตว่าฉันได้mod_negotiationเปิดใช้งานและ MultiViews ระหว่างตัวเลือกสำหรับ virtualhost ที่เกี่ยวข้อง:

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

ฉันใช้mod_rewriteด้วย.htaccessกฎต่อไปนี้:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

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

ดูเหมือนแปลกมาก แต่ในกล่องเดียวกันกับ PHP 5.3.6 มันใช้งานได้อย่างถูกต้อง ฉันแค่พยายามอัพเกรดเป็น PHP 5.4.0 แต่ฉันไม่สามารถแก้ปัญหาการเจรจาต่อรองนี้ได้ มีความคิดเห็นใดเกี่ยวกับสาเหตุที่ Apache ไม่สามารถจับคู่ได้contents.phpเมื่อถามหาcontent(ซึ่งควรเป็น mod_negotiation ที่ควรทำ)

UPDATE:ฉันสังเกตเห็นว่า mod_negotiation ทำงานอย่างถูกต้องกับไฟล์ที่มีนามสกุลแตกต่างจาก. php: ดังนั้นหากฉันมีไฟล์ชื่อ /admin/contents.txt ฉันสามารถเข้าถึงเบราว์เซอร์ที่มี / admin / content url ได้ ดังนั้นปัญหาจึงเป็นเพียงไฟล์ php เบาะแสอะไรที่ทำให้การเจรจาล้มเหลว


คุณจะกำหนดค่า mod_negotiation อย่างไร คุณใช้มันหรือเปล่า
Mircea Vutcovici

ดีฉันเพิ่งรวม mod_negotiation ใน httpd.conf แล้วตัวเลือก MultiViews ใน VirtualHost ควรจะเพียงพอที่จะทำสิ่งที่ฉันกำลังมองหาเท่าที่ฉันรู้ .. ใช่ไหม?
lorenzo.marcon

3
FWIW ฉันมีปัญหากับการ+MultiViewsเปิดใช้งานและมันหายไปเมื่อปิดการใช้งาน
เฟลิกซ์แฟรงค์

คำตอบ:


39

ฉันพบวิธีแก้ปัญหา ง่ายมากแน่นอน ฉันลืมที่จะรวมต่อไปนี้:

AddType application/x-httpd-php .php

ในส่วน apache mod_mime สู่ httpd.conf

ฉันถูกเข้าใจผิดจากความจริงที่ว่าสคริปต์ PHP ทำงานได้อย่างถูกต้อง อย่างไรก็ตามการเจรจาล้มเหลวเนื่องจาก mod_negotiation ค้นหาเฉพาะประเภทไฟล์ "น่าสนใจ" (และรู้จัก)


3
นี้! ถูกต้องที่นี่! ใช้เวลาส่วนใหญ่ในการตามล่าหาเหตุผลว่าทำไมฉันถึงได้รับข้อผิดพลาด "Discovered File (s) / None Negotiated" ที่ไม่มีประโยชน์ สคริปต์ทำงานได้ดีก่อนหน้านี้และฉันมีมารครั้งหนึ่งที่ติดตามความจริงที่ว่าประเภทนั้นไม่ได้รวมอยู่ใน mod_mime ในการเผยแพร่ที่ฉันกำลังทดสอบ ฉันเป็นหนี้คุณนายเบียร์
Akoi Meexx

ฉันยินดีรับเบียร์ของคุณเมื่อฉันมาที่สหรัฐอเมริกา :)
lorenzo.marcon

มันทำงานได้อย่างสมบูรณ์แบบ !! @ lorenzo.marcon ขอบคุณสำหรับคำถามและคำตอบ!
rogcg

ต้องมีการเปลี่ยนแปลงในบางจุด ฉันรู้สึกค่อนข้างมั่นใจฉันไม่จำเป็นต้องเพิ่มสิ่งนี้ก่อนหน้านี้เพื่อให้ MultiPiews แบบ php ทำงานได้
user1338062

ขอบคุณเมตริกตัน! ฉันกำลังต่อสู้กับกำแพงสงสัยว่าทำไม mod ของฉันเขียนใหม่จากการค้นหา /? $ ถึง search.php ไม่ทำงาน ดูเหมือนว่าโมดูล negoitiation จะมีความสำคัญเหนือกว่าโมดูล rewrite ซึ่งโดยทั่วไปดีที่จะรู้
zıəsuɐɟəʇs

12

ฉันมีปัญหาเดียวกันหลังจากอัปเดตจาก Debian Squeeze เป็น Wheezy mods-enabled/mime.confรวมถึงชนิดแฟ้มที่รู้จักจากระบบ:

TypesConfig /etc/mime.types

ปัญหาคือ/etc/mime.typesไฟล์ถูกแทนที่ด้วยการอัพเดทและในไฟล์ที่ถูกแทนที่ส่วน PHP ถูกคอมเม้นท์ เมื่อทำการค้นหาฉันพบ:

#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

ฉันต้องลบออก#จากแต่ละบรรทัดที่มีเนื้อหาที่เกี่ยวข้องกับ php จากนั้นบันทึกและรีสตาร์ทเว็บเซิร์ฟเวอร์ Apache ที่แก้ไขปัญหาโดยไม่ต้องแก้ไขmime.confไฟล์


สิ่งนี้ช่วยฉันได้หลังจากการดีบัก 4 วินาทีโดยไม่มีการแก้ไขกับผี
MarkSkayff

โปรดระวังว่าการทำเช่นนี้อาจทำให้libapache-mod-php5ไฟล์เรียกใช้งาน.phpในชื่อ (เหมือนfilename.php.jpeg) ซึ่งเป็นเหตุผลดั้งเดิมสำหรับแสดงความคิดเห็น ดูbugs.debian.org/589384
Kevinoid

0

แทนที่จะทำแผนที่.phpกับประเภทสื่อ (ซึ่งอาจมีผลกระทบด้านความปลอดภัยดังที่อธิบายไว้ในDebian Bug 589384ซึ่งปิดใช้งาน) คุณสามารถกำหนดค่าMultiviewsMatchให้จับคู่ไฟล์โดยไม่ต้องพิมพ์.phpตามที่แนะนำในคำตอบของ Mark Amery สำหรับคำถามที่คล้ายกัน :

<Files "*.php">
    MultiviewsMatch Any
</Files>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.