Garis miring tidak konsisten dalam variabel DOCUMENT_ROOT dalam PHP saat menggunakan Apache


10

Dalam lingkungan server yang berbeda, PHP $_SERVER['DOCUMENT_ROOT']super global terkadang memiliki garis miring dan terkadang tidak. Saya akan berpikir masalah ini berkaitan langsung dengan bagaimana Apache DocumentRootdidefinisikan dalam httpd.conffile:

yaitu saya akan berpikir bahwa jika httpd.conftidak mengandung garis miring:

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

maka echo $_SERVER['DOCUMENT_ROOT']harus memberikan / var / www / live / saat ini

dan jika httpd.confmemang mengandung garis miring:

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

maka echo $_SERVER['DOCUMENT_ROOT']harus memberikan / var / www / live / current /

Ini adalah kasus di Ubuntu 10,04 tetapi pada RHEL 5,5 garis miring ditambahkan ke $_SERVER['DOCUMENT_ROOT']bahkan jika tidak ada yang didefinisikan pada Apache.

Adakah yang tahu mengapa ini terjadi? Apakah ada parameter konfigurasi yang saya lewatkan?


Sebagai referensi:

  • PHP 5.3.3 dari RHEL (masalah terjadi): PHP 5.3.3 (cli) (dibangun: 23 Juli 2010 16:26:53)
  • Versi PHP Ubuntu (tidak ada masalah): PHP 5.3.2-1ubuntu4.2 dengan Suhosin-Patch (cli) (dibangun: 13 Mei 2010 20:03:45)

Jawaban:


6

Saya tidak tahu mengapa slash berubah antara host virtual Anda. Ngomong-ngomong, apakah ini penting? Cukup tambahkan garis miring baru ke program Anda (hapus jika garis miring ganda ada) dan masalahnya terpecahkan.

saya menggunakan

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

4
Anda cukup menggunakan $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. Secara otomatis menghapus semua banyak garis miring dan juga garis miring. Jika Anda selalu ingin garis miring menyatukannya dengan hasil panggilan di atas realpath(). Tidak di dalamnya.
Flu

1
Saya dapat mengkonfirmasi masalah yang sama (php 5.5) antara host Hosteurope (Ubuntu saya pikir): memiliki slash ... dan Windows 7: no slash (instal XAMPP yang cukup baru)
Frank Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'harus sedikit lebih cepat daripada semua hal yang dapat dilakukan realpath.
Frank Nocke


3

Root dokumen di lingkungan Apache dapat didefinisikan di lebih dari satu tempat.

Ya, httpd.confberisi pengaturan ini, tetapi dapat ditimpa karena file ini digunakan untuk konfigurasi default.

Saya sarankan Anda pergi memeriksa konfigurasi vhost di bawah vhosts.ddan sites-availabledirektori.


2

Solusi yang diusulkan:

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

tidak bekerja di semua instalasi.

Misalnya, dalam kasus saya:

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

Masalah yang sama seperti sebelumnya.

Mungkin Anda harus memodifikasi instruksi pertama di:

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

thistle


1
rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'harus sedikit lebih cepat daripada semua hal yang dapat dilakukan realpath.
Frank Nocke

2

Jawaban Dom adalah solusi untuk masalah ini, namun pernyataan stefanvesca adalah alasan mengapa di lingkungan yang berbeda Anda mengalami double '//'. Pada mesin lokal Anda, dalam file .conf Anda tempat Anda mengatur host virtual Anda, Anda kemungkinan besar menambahkan / di akhir root dokumen yang ditentukan, sedangkan orang yang mengatur lingkungan Anda yang lain tidak, atau sebaliknya.

Bagaimanapun, ketika menggunakan $ _SERVER php ['DOCUMENT_ROOT'] Anda mendapatkan nilai lingkungan apache yang merupakan hasil dari konfigurasi. Itulah alasan '/' di satu lingkungan dan '//' di lingkungan lain.


1

Saya akan mengatakan itu diasumsikan DOCUMENT_ROOT tidak memiliki garis miring.

Nilai ini dilewatkan dari konfigurasi server web

apache

DocumentRoot /var/www/html

Itu menyiratkan kita harus memiliki garis miring terkemuka untuk jalur yang kita tambahkan padanya.

Mengetahui bahwa garis miring ganda '//' di mana saja di jalur tidak memiliki konsekuensi (bila terkait dengan filesystem ... di url http, mungkin ada kasus di mana terdapat beberapa gangguan)

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

Ketika ada garis miring untuk DOCUMENT_ROOT kita dapat menyalahkan sysadmin pada sesuatu yang tidak memiliki konsekuensi :)

Dan abaikan saja?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.