Dấu gạch chéo không nhất quán trong biến DOCUMENT_ROOT trong PHP khi sử dụng Apache


10

Trong các môi trường máy chủ khác nhau, $_SERVER['DOCUMENT_ROOT']siêu toàn cầu PHP đôi khi có dấu gạch chéo và đôi khi không. Tôi đã nghĩ rằng vấn đề này liên quan trực tiếp đến cách DocumentRootxác định Apache trong httpd.conftệp:

tức là tôi đã nghĩ rằng nếu httpd.confkhông chứa dấu gạch chéo:

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

sau đó echo $_SERVER['DOCUMENT_ROOT']nên cho / var / www / live / current

và nếu httpd.confcó chứa dấu gạch chéo:

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

sau đó echo $_SERVER['DOCUMENT_ROOT']nên cho / var / www / live / current /

Đây là trường hợp trên Ubuntu 10.04 nhưng trên RHEL 5.5, một dấu gạch chéo được thêm vào $_SERVER['DOCUMENT_ROOT']ngay cả khi không có định nghĩa nào trên Apache.

Bất cứ ý tưởng tại sao điều này xảy ra? Có một tham số cấu hình mà tôi đang thiếu?


Để tham khảo:

  • PHP 5.3.3 của RHEL (xảy ra sự cố): PHP 5.3.3 (cli) (được xây dựng: 23 tháng 7 2010 16:26:53)
  • Phiên bản PHP của Ubuntu (không có vấn đề): PHP 5.3.2-1ubfox4.2 với Suhosin-Patch (cli) (được xây dựng: ngày 13 tháng 5 năm 2010 20:03:45)

Câu trả lời:


6

Tôi không biết tại sao dấu gạch chéo đang thay đổi giữa các máy chủ ảo của bạn. Nhân tiện, nó có quan trọng không? Chỉ cần thêm một dấu gạch chéo mới vào các chương trình của bạn (loại bỏ nếu có dấu gạch chéo kép) và vấn đề được giải quyết.

tôi sử dụng

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

4
Bạn chỉ có thể sử dụng $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Nó tự động loại bỏ tất cả các dấu gạch chéo và cả dấu gạch chéo. Nếu bạn luôn muốn một dấu gạch chéo nối nó với kết quả của cuộc gọi ở trên realpath(). Không phải bên trong nó.
cúm

1
Tôi có thể xác nhận cùng một vấn đề (php 5.5) giữa một loạt Hosteurope (Ubuntu Tôi nghĩ): có dấu gạch chéo ... và Windows 7: không có dấu gạch chéo (XAMPP khá gần đây cài đặt)
Frank Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'nên nhanh hơn một chút so với tất cả những điều mà realpath có thể làm.
Frank Nocke


3

Tài liệu gốc trong môi trường Apache có thể được định nghĩa ở nhiều nơi.

Có, httpd.confchứa các cài đặt này, nhưng chúng có thể được ghi đè vì tệp này được sử dụng cho cấu hình mặc định.

Tôi khuyên bạn nên kiểm tra cấu hình vhost bên dưới vhosts.dvà các sites-availablethư mục.


2

Giải pháp đề xuất:

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

không hoạt động trong tất cả các cài đặt.

Ví dụ, trong trường hợp của tôi:

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

Vấn đề tương tự như trước đây.

Có thể bạn nên sửa đổi hướng dẫn đầu tiên trong:

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

cây kế


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'nên nhanh hơn một chút so với tất cả những điều mà realpath có thể làm.
Frank Nocke

2

Câu trả lời của Dom là một giải pháp cho vấn đề này, tuy nhiên tuyên bố của stefanvesca là lý do tại sao trong các môi trường khác nhau, bạn đang trải qua cú đúp '//'. Trên máy cục bộ của bạn, trong tệp .conf nơi bạn thiết lập máy chủ ảo, rất có thể bạn đã thêm / ở cuối gốc tài liệu đã xác định, trong khi người thiết lập môi trường khác của bạn thì không, hoặc ngược lại.

Dù sao, khi sử dụng $ _SERVER ['DOCUMENT_ROOT'] của php, bạn sẽ nhận được giá trị môi trường apache là kết quả của cấu hình. Đó là lý do cho '/' trong một môi trường và '//' trong một môi trường khác.


1

Tôi muốn nói rằng nó giả định DOCUMENT_ROOT không có dấu gạch chéo.

Giá trị này được truyền từ cấu hình máy chủ web

apache

DocumentRoot /var/www/html

Điều đó ngụ ý rằng chúng ta nên có một dấu gạch chéo dẫn đến đường dẫn mà chúng ta thêm vào nó.

Biết rằng một dấu gạch chéo kép '//' bất cứ nơi nào trong đường dẫn không có hậu quả (khi liên quan đến hệ thống tệp ... trong url http, có thể có trường hợp có một số trục trặc)

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

Khi có dấu gạch chéo vào DOCUMENT_ROOT, chúng ta có thể đổ lỗi cho sysadmin về thứ gì đó không có hậu quả :)

Và an toàn bỏ qua nó?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.