เครื่องหมายทับท้ายที่ไม่สอดคล้องในตัวแปร DOCUMENT_ROOT ใน PHP เมื่อใช้ Apache


10

ในสภาพแวดล้อมเซิร์ฟเวอร์ที่แตกต่างกัน PHP $_SERVER['DOCUMENT_ROOT']super global บางครั้งก็มีเครื่องหมายทับท้ายและบางครั้งก็ไม่มี ฉันคิดว่าปัญหานี้เกี่ยวข้องโดยตรงกับการกำหนด Apache DocumentRootในhttpd.confไฟล์:

เช่นฉันจะคิดว่าถ้าhttpd.confไม่มีเครื่องหมายทับ:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current
    ...

จากนั้นecho $_SERVER['DOCUMENT_ROOT']ควรให้/ var / www / live / current

และถ้าhttpd.confมีเครื่องหมายสแลชต่อท้าย:

<VirtualHost *:8880>
    DocumentRoot /var/www/live/current/
    ...

จากนั้นecho $_SERVER['DOCUMENT_ROOT']ควรให้/ var / www / live / current /

นี่เป็นกรณีใน Ubuntu 10.04 แต่ใน RHEL 5.5 จะมีการเพิ่มเครื่องหมายสแลชต่อท้าย$_SERVER['DOCUMENT_ROOT']แม้ว่าจะไม่มีการกำหนดไว้ใน Apache

มีความคิดว่าทำไมสิ่งนี้เกิดขึ้น? มีพารามิเตอร์การกำหนดค่าที่ฉันขาดหายไปหรือไม่


สำหรับการอ้างอิง:

  • PHP 5.3.3 ของ RHEL (ปัญหาเกิดขึ้น): PHP 5.3.3 (cli) (สร้างขึ้น: 23 กรกฎาคม 2010 16:26:53)
  • Ubuntu รุ่น PHP (ไม่มีปัญหา): PHP 5.3.2-1ubuntu4.2 พร้อม Suhosin-Patch (cli) (สร้าง: 13 พฤษภาคม 2010 20:03:45)

คำตอบ:


6

ฉันไม่รู้ว่าทำไมเครื่องหมายสแลชกำลังเปลี่ยนไประหว่างโฮสต์เสมือนของคุณ มันสำคัญไหม? เพียงเพิ่มเครื่องหมายทับใหม่ลงในโปรแกรมของคุณ (ลบหากมีเครื่องหมายทับสองอัน) และแก้ไขปัญหาได้แล้ว

ฉันใช้

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

4
$realpath = realpath($_SERVER['DOCUMENT_ROOT']);คุณก็สามารถใช้ มันจะลบเครื่องหมายทับหลายอันทั้งหมดโดยอัตโนมัติ หากคุณต้องการ concatenate realpath()ท้ายเฉือนไปยังผลมาจากการเรียกร้องดังกล่าวข้างต้นไป ไม่ได้อยู่ข้างใน
ไข้หวัดใหญ่

1
ฉันสามารถยืนยันปัญหาเดียวกัน (php 5.5) ระหว่างโฮสต์ Hosteurope (Ubuntu ฉันคิดว่า): มีเครื่องหมายทับ ... และ Windows 7: ไม่มีเครื่องหมายทับ (ติดตั้ง XAMPP ล่าสุดค่อนข้าง)
Frank Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'ควรจะเร็วกว่าสิ่งเหล่านี้จริง ๆ สามารถทำได้
Frank Nocke


3

รากเอกสารในสภาพแวดล้อม Apache สามารถกำหนดได้มากกว่าหนึ่งแห่ง

ใช่httpd.confมีการตั้งค่าเหล่านี้ แต่สามารถเขียนทับได้เนื่องจากไฟล์นี้ใช้สำหรับการกำหนดค่าเริ่มต้น

ฉันขอแนะนำให้คุณไปตรวจสอบการกำหนดค่า vhost ภายใต้vhosts.dและsites-availableไดเรกทอรี


2

ทางออกที่นำเสนอ:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT']."/");
$realpath = str_replace ("//", "/", $realpath);

ไม่ทำงานในการติดตั้งทั้งหมด

ตัวอย่างเช่นในกรณีของฉัน:

$_SERVER['DOCUMENT_ROOT']  = "/www/site/"
$_SERVER['DOCUMENT_ROOT']."/" = "/www/site//"
realpath("/www/site//") = "/www/site"
str_replace("//", "/", "/www/site") = "/www/site"

ปัญหาเช่นเดิม

คุณอาจจะแก้ไขคำสั่งแรกใน:

$realpath = realpath ($_SERVER['DOCUMENT_ROOT'])."/";

หนาม


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'ควรจะเร็วกว่าสิ่งเหล่านี้จริง ๆ สามารถทำได้
Frank Nocke

2

คำตอบของ Dom เป็นวิธีแก้ปัญหานี้อย่างไรก็ตามคำสั่งของ stefanvesca คือเหตุผลว่าทำไมในสภาพแวดล้อมที่แตกต่างกันคุณกำลังประสบกับปัญหา '//' สองเท่า บนเครื่องโลคัลของคุณภายในไฟล์. conf ที่คุณตั้งค่าโฮสต์เสมือนของคุณคุณอาจเพิ่ม / ท้ายของรูทเอกสารที่กำหนดไว้ในขณะที่บุคคลที่ตั้งค่าสภาพแวดล้อมอื่นของคุณไม่ได้หรือในทางกลับกัน

อย่างไรก็ตามเมื่อใช้ $ _SERVER ['DOCUMENT_ROOT'] ของ php คุณจะได้รับค่าสภาพแวดล้อม apache ซึ่งเป็นผลมาจากการกำหนดค่า นั่นคือเหตุผลสำหรับ '/' ในสภาพแวดล้อมหนึ่งและ '//' ในอีกสภาพแวดล้อมหนึ่ง


1

ฉันจะบอกว่ามันสันนิษฐานว่า DOCUMENT_ROOT ไม่มีเครื่องหมายทับ

ค่านี้ถูกส่งผ่านจากการกำหนดค่าเว็บเซิร์ฟเวอร์

อาปาเช่

DocumentRoot /var/www/html

นั่นก็หมายความว่าเราควรมีเครื่องหมายทับที่นำไปสู่เส้นทางที่เราเพิ่มเข้าไป

การรู้ว่า double slash '//' ที่ใดก็ได้ในพา ธ ไม่มีผล (เมื่อเกี่ยวข้องกับระบบไฟล์ ... ใน http url อาจมีบางกรณีที่มีข้อบกพร่องบางอย่าง)

$ cat /etc//issue Debian GNU/Linux 9 \n \l

เมื่อมีเครื่องหมายทับต่อท้ายที่ DOCUMENT_ROOT เราสามารถตำหนิดูแลระบบในบางสิ่งที่ไม่มีผล :)

และไม่สนใจมันอย่างปลอดภัยหรือไม่

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