Bagaimana cara menyertakan file lebih dari 2 direktori kembali?


96

Bagaimana Anda memasukkan file yang lebih dari 2 direktori kembali. Saya tahu Anda dapat menggunakan ../index.phpuntuk memasukkan file yang merupakan 2 direktori kembali, tetapi bagaimana Anda melakukannya untuk 3 direktori kembali? Apakah ini masuk akal? Saya sudah mencoba .../index.phptetapi tidak berhasil.

Saya memiliki file /game/forum/files/index.phpdan menggunakan PHP termasuk untuk menyertakan file. Yang terletak di /includes/boot.inc.php; /menjadi direktori root.


chdir ('' ../ '');
maheshmnj

Jawaban:


154

..memilih direktori induk dari arus. Tentu saja, ini bisa dirangkai:

../../index.php

Ini akan menjadi dua direktori.


1
@ Brian Nah, itu tidak masuk akal, Anda membandingkan apel dan jeruk. Anda benar bahwa a defineakan digunakan di sini, tetapi (1) itu bahkan bukanlah pertanyaan di sini. Dan (2) Anda masih akan menggunakan jalur relatif di Anda define, Kecuali Anda benar-benar membuat kode keras seluruh jalur server absolut dan saya akan menahannya karena itu hanya memiliki kelemahan. Atau (alternatif ketiga) Anda bisa menggunakan manipulasi string untuk mengekstrak direktori induk dari jalur (diperluas) saat ini tetapi sekali lagi ini tidak memiliki keuntungan apa pun untuk menggunakan jalur relatif.
Konrad Rudolph

Sayangnya ini dapat bekerja pada satu perangkat dan tidak pada perangkat lainnya, /../dapat bekerja atau ../dapat bekerja, atau tidak dapat bekerja pada tiga komputer yang berbeda dengan pengaturan lingkungan yang sama persis
Douglas Gaskell

@DouglasGaskell Tidak, itu salah. Notasi jalur relatif, termasuk ../dan ../../(catatan: tidak ada garis miring!), Berfungsi pada semua sistem operasi modern. Ini digunakan untuk tidak bekerja pada Windows dan ( lama lalu) Macintosh tetapi sekarang bekerja di mana-mana, dan memiliki setidaknya satu tahun sepuluh terakhir. Jika tidak berfungsi di suatu tempat maka alasannya adalah struktur file berbeda, dan / atau Anda berada di direktori kerja yang berbeda. Tapi itu tidak ada hubungannya dengan kode ini.
Konrad Rudolph

Konrad, saya menyebutkan ini karena saya baru saja menangani masalah ini tidak 10 menit yang lalu setelah berbagi repositori dengan rekan kerja, menggunakan snapshot VM. Untuk beberapa alasan, semua jalan harus memiliki /../alih - alih ../pada lingkungannya.
Douglas Gaskell

@DouglasGaskell Dan saya dapat memberi tahu Anda dengan yakin bahwa kesalahan itu tidak ada hubungannya. Faktanya, jalur /../tidak masuk akal pada sistem apa pun (ini setara dengan /, atau kesalahan). Apakah Anda yakin tidak sedang menempelkan sesuatu di depannya?
Konrad Rudolph

51

Untuk memasukkan file satu direktori ke belakang, gunakan '../file'. Untuk dua direktori kembali, gunakan '../../file'. Dan seterusnya.

Meskipun, secara realistis Anda tidak boleh melakukan include yang berhubungan dengan direktori saat ini. Bagaimana jika Anda ingin memindahkan file itu? Semua tautan akan putus. Cara untuk memastikan bahwa Anda masih dapat menautkan ke file lain, sambil tetap mempertahankan tautan tersebut jika Anda memindahkan file, adalah:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT adalah variabel server yang mewakili direktori dasar tempat kode Anda berada.


2
Pertanyaan singkat Hey Dan: Anda mengatakan "secara realistis Anda tidak harus melakukan include yang berhubungan dengan direktori saat ini ". Bagaimana dengan semua jalur relatif yang bertebaran di sebagian besar dokumen HTML? Jika saya memindahkan file saya, bukankah itu akan rusak juga? Apakah ada standar kapan harus menggunakan tautan relatif vs absolut? Terima kasih sebelumnya!
Govind Rai

2
saya pikir ada satu garis miring yang hilang, seharusnya: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
pengguna889030

@ user889030 sejauh yang saya tahu, garis miring tidak diperlukan, setidaknya di sebagian besar kasus
BotMaster3000


28
. = current directory
.. = parent directory

Jadi ../memberi Anda satu direktori kembali, bukan dua .

Rantai ../sebanyak yang diperlukan untuk naik 2 level atau lebih.


21
include dirname(__FILE__).'/../../index.php';

adalah taruhan terbaik Anda di sini, dan ini akan menghindari sebagian besar bug jalur relatif yang dapat Anda temui dengan solusi lain.

Memang, ini akan memaksa penyertaan untuk selalu relatif terhadap posisi skrip saat ini tempat kode ini ditempatkan (lokasi mana yang kemungkinan besar stabil, karena Anda menentukan arsitektur aplikasi Anda). Ini berbeda dari hanya melakukan include '../../index.php' yang akan menyertakan secara relatif ke skrip yang menjalankan (juga disebut "memanggil") dan kemudian secara relatif ke direktori kerja saat ini , yang akan mengarah ke skrip induk yang menyertakan skrip Anda, alih-alih menyelesaikan dari jalur skrip yang Anda sertakan .

Dari dokumentasi PHP:

File disertakan berdasarkan jalur file yang diberikan atau, jika tidak ada yang diberikan, include_path ditentukan. Jika file tidak ditemukan di include_path, include akhirnya akan memeriksa direktori skrip pemanggil itu sendiri dan direktori kerja saat ini sebelum gagal.

Dan posting tertua yang saya temukan mengutip trik ini berasal dari tahun 2003, oleh Tapken .

Anda dapat menguji dengan pengaturan berikut:

Buat tata letak seperti ini:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

Dalam parent.php, menempatkan:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

Dalam sub/included.php, menempatkan:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

Hasil saat mengakses parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

Seperti yang bisa kita lihat, dalam kasus pertama, jalur diselesaikan dari skrip pemanggil parent.php, sedangkan dengan menggunakan dirname(__FILE__).'/path'trik, penyertaan dilakukan dari skrip included.phptempat kode ditempatkan.

Waspadalah, berikut ini TIDAK setara dengan trik di atas yang bertentangan dengan yang bisa dibaca di tempat lain:

include '/../../index.php';

Memang, prepending /akan berfungsi, tetapi itu akan menyelesaikan seperti include ../../index.phpdari skrip panggilan (perbedaannya adalah include_pathtidak akan terlihat setelah itu jika gagal). Dari dokumen PHP :

Jika jalur ditentukan - apakah absolut (dimulai dengan huruf drive atau \ pada Windows, atau / pada sistem Unix / Linux) atau relatif terhadap direktori saat ini (dimulai dengan. Atau ..) - include_path akan diabaikan sama sekali.


@diEcho: bolehkah saya tahu mengapa itu "sepenuhnya salah"? Saya menggunakannya pada beberapa aplikasi kelas profesional dan metode ini sebenarnya satu-satunya yang berhasil di setiap situasi. Ini juga dirinci dalam manual php : tidak mungkin itu salah.
gaborous

baris pertama benar-benar salah. Anda tidak dapat menambahkan ..jalan tengah (relatif / absolut).
diEcho

@diEcho Saya juga harus mengarahkan Anda ke manual PHP: php.net/manual/en/function.include.php
gaborous

beri tahu saya satu contoh, di mana ..digunakan di tengah include. itu harus selalu menjadi bagian pertama dari
penyertaan

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Modul tingkat profesional untuk ERP / CRM tingkat profesional. Anda, Tuan, seharusnya tidak berbicara ketika Anda tidak tahu apa yang Anda katakan.
gaborous

16

../adalah satu direktori, Ulangi untuk dua ../../atau bahkan tiga direktori : ../../../dan seterusnya.

Menentukan konstanta dapat mengurangi kebingungan karena Anda akan menelusuri ke belakang ke direktori ayat

Anda dapat mendefinisikan beberapa konstanta seperti ini:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

Saat menggunakan 'BD' atau 'direktori dasar' saya, tampilannya seperti ini:

file(BD.'location/of/file.php');

menetapkan(); referensi



12
../../../includes/boot.inc.php

Setiap contoh ../berarti naik / mundur satu direktori.


9

berikut adalah cara untuk mengakses berbagai direktori Anda: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower

7

Anda dapat melakukannya ../../directory/file.txt- Ini kembali ke dua direktori.

../../../- ini berlaku tiga. dll



6

Tapi hati- SANGAT -hati tentang membiarkan pengguna memilih file. Anda tidak benar-benar ingin mengizinkan mereka mendapatkan file bernama, misalnya,

../../../../../../../../../../etc/passwd

atau file sistem sensitif lainnya.

(Maaf, sudah lama sejak saya menjadi sysadmin linux, dan saya pikir ini adalah file sensitif, dari yang saya ingat)



5

jika Anda menggunakan php7 Anda dapat menggunakan fungsi dirname dengan parameter level 2, misalnya:

dirname("/usr/local/lib", 2);

parameter kedua "2" menunjukkan berapa banyak level

referensi dirname



3

termasuk lebih dari direktori dapat diproses oleh file proxy

  • akar
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';
    

3

Coba ini

contoh ini adalah satu direktori kembali

require_once('../images/yourimg.png');

contoh ini adalah dua direktori kembali

require_once('../../images/yourimg.png');

Persis sama ;-) Saya pikir maksud Anda '../../images/yourimg.png' pada gambar kedua?
Edwin

opps itu kesalahan saya
rajpoot rehan

2

Coba ../../. Anda dapat memodifikasinya karena ini akan membawa Anda kembali ke dua direktori. Pertama, buka direktori root, lalu akses direktori yang diperlukan.

Misal Anda berada di dalam root/inc/usr/apdan ada direktori lain root/2nd/path. Anda dapat mengakses pathdirektori dari apseperti ini: ../../2nd/pathpertama pergi ke root daripada direktori yang diinginkan. Jika tidak berfungsi, silakan bagikan.


2

jika Anda menyertakan /di awal penyertaan, penyertaan akan diambil sebagai jalur dari akar situs.

jika situs Anda adalah http://www.example.com/game/forum/files/index.php, Anda dapat menambahkan penyertaan ke /includes/boot.inc.php yang akan berubah menjadi http://www.example.com /includes/boot.inc.php .

Anda harus berhati-hati dengan ..traversal karena beberapa server web telah menonaktifkannya; ini juga menyebabkan masalah saat Anda ingin memindahkan situs Anda ke mesin / host baru dan strukturnya sedikit berbeda.


1

Saya melihat jawaban Anda dan saya menggunakan path termasuk dengan sintaks

require_once '../file.php'; // server internal error 500

dan server http (Apache 2.4.3) mengembalikan kesalahan internal 500.

Ketika saya mengubah jalan ke

require_once '/../file.php'; // OK

semuanya baik-baik 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.