2 개의 디렉토리에 파일을 포함하려면 어떻게해야합니까?


94

디렉토리가 3 개 이상인 파일을 어떻게 포함합니까? ../index.php2 개의 디렉토리가있는 파일을 포함하는 데 사용할 수 있다는 것을 알고 있지만 3 개의 디렉토리에 대해 어떻게 수행합니까? 이게 말이 돼? 시도 .../index.php했지만 작동하지 않습니다.

파일이 /game/forum/files/index.php있고 PHP include를 사용하여 파일을 포함합니다. 에 위치한 /includes/boot.inc.php; /루트 디렉토리입니다.


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

답변:


152

..현재에서 상위 디렉토리를 선택합니다. 물론 다음과 같이 연결할 수 있습니다.

../../index.php

이것은 두 개의 디렉토리가 될 것입니다.


1
@Brian 글쎄, 그건 말도 안돼, 당신은 사과와 오렌지를 비교하고 있습니다. define여기서 a 가 사용되는 것이 맞지만 (1) 여기서는 원격으로도 문제가되지 않았습니다. 그리고 (2) define전체 절대 서버 경로를 실제로 하드 코딩하지 않는 한 여전히 .NET에서 상대 경로를 사용하고 단점 만 있기 때문에 자제 할 것입니다. 또는 (세 번째 대안) 문자열 조작을 사용하여 (확장 된) 현재 경로에서 상위 디렉토리를 추출 할 수 있지만 다시 한 번 이것은 상대 경로를 사용하는 데 아무런 이점 이 없습니다 .
Konrad Rudolph

슬프게도이 하나의 장치에서 작동 할 수 있고하지 다른, /../작동하거나 ../작동하지 않을 수 있습니다, 또는 둘 다 동일한 환경 설정으로 세 가지 다른 컴퓨터에서 작동하지 않을 수 있습니다
더글러스 Gaskell

@DouglasGaskell 아니요, 틀 렸습니다. ../../../(참고 : 선행 슬래시 없음 !)를 포함한 상대 경로 표기법 은 모든 최신 운영 체제에서 작동합니다. 그것은 에 사용 하지 Windows에서 작업하고 ( 오래 전) 매킨토시하지만 지금은 모든 곳에서 작동하고, 적어도 지난 10 년 동안이 있습니다. 어딘가에서 작동하지 않으면 파일 구조가 다르거 나 다른 작업 디렉토리에 있기 때문입니다. 하지만이 코드와는 관련이 없습니다.
Konrad Rudolph

Konrad, 저는 VM 스냅 샷을 사용하여 동료와 저장소를 공유 한 후 10 분 전에이 문제를 방금 처리했기 때문에 이것을 언급했습니다. 어떤 이유로 모든 경로는 그의 환경 /../대신에 있어야 ../했습니다.
Douglas Gaskell

@DouglasGaskell 그리고 오류가 관련이 없다고 확신을 가지고 말할 수 있습니다. 실제로 경로 /../는 어떤 시스템에서도 의미가 없습니다 ( /또는 오류 와 동일 ). 그 앞에 무언가를 붙여넣고 있지 않습니까?
Konrad Rudolph

51

한 디렉토리 뒤로 파일을 포함하려면 '../file'. 두 개의 디렉토리를 다시 사용하려면 '../../file'. 등등.

그러나 현실적으로 현재 디렉토리를 기준으로 include를 수행해서는 안됩니다. 해당 파일을 이동하려면 어떻게해야합니까? 모든 링크가 끊어집니다. 파일을 이동하는 경우 해당 링크를 유지하면서 다른 파일에 링크 할 수 있도록하는 방법은 다음과 같습니다.

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

DOCUMENT_ROOT 코드가있는 기본 디렉토리를 나타내는 서버 변수입니다.


2
Hey Dan 빠른 질문 : " 현실적으로 현재 디렉토리를 기준으로 포함을 수행해서는 안됩니다 "라고 말합니다 . 대부분의 HTML 문서에 산재 해있는 모든 상대 경로는 어떻습니까? 내 파일을 옮겼다면 이것도 깨지지 않나요? 상대 링크와 절대 링크를 언제 사용할 지에 대한 표준이 있습니까? 미리 감사드립니다!
Govind Rai 2016

2
하나의 슬래시가 누락되었다고 생각합니다. require_once ($ _ SERVER [ 'DOCUMENT_ROOT']. '/ directory / directory / file');
user889030 dec. 06 '172017-12-06

@ user889030 지금까지 내가 아는 한, 그 슬래시가 최소한으로 필요하지 않는 한 대부분의 경우
BotMaster3000


27
. = current directory
.. = parent directory

따라서 두 개가 아닌 하나의 디렉토리를 다시../ 가져 옵니다 .

체인 ../필요한만큼 여러 번 같은 2 개 이상의 수준을 이동합니다.


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

여기서 가장 좋은 방법이며 다른 솔루션에서 발생할 수있는 상대 경로 버그의 대부분을 피할 수 있습니다.

실제로이 코드가 배치 된 현재 스크립트의 위치 (애플리케이션의 아키텍처를 정의하기 때문에 가장 안정적인 위치) 에 항상 상대적으로 포함되도록 강제합니다 . 이것은 include '../../index.php' 실행 ( "호출"이라고도 함) 스크립트에 상대적으로 포함 된 다음 상대적으로 현재 작업 디렉토리 를 포함하는 작업과 다릅니다. 포함 된 스크립트 경로에서 확인하는 대신 스크립트를 포함하는 상위 스크립트를 가리 킵니다. .

PHP 문서에서 :

파일은 주어진 파일 경로 또는 지정된 경로가 없으면 include_path를 기반으로 포함됩니다. include_path에서 파일을 찾을 수 없으면 include는 실패하기 전에 마지막으로 호출 스크립트의 자체 디렉토리와 현재 작업 디렉토리를 확인합니다.

이 트릭을 인용 한 가장 오래된 게시물은 2003 년 Tapken의 게시물 입니다.

다음 설정으로 테스트 할 수 있습니다.

다음과 같은 레이아웃을 만듭니다.

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

에 다음 parent.php을 입력하십시오.

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

에 다음 sub/included.php을 입력하십시오.

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

액세스시 결과 parent.php:

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

보시다시피 첫 번째 경우 경로는 호출하는 스크립트에서 확인되는 parent.php반면 dirname(__FILE__).'/path'트릭 을 사용 included.php하면 코드가 있는 스크립트 에서 포함이 수행 됩니다.

다음은 다른 곳에서 읽을 수있는 것과는 반대로 위의 트릭과 동일하지 않습니다.

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

실제로 prepending /은 작동하지만 include ../../index.php호출 스크립트 에서처럼 해결 됩니다 (차이점은 include_path실패 할 경우 나중에 표시되지 않는다는 것입니다). PHP 문서에서 :

경로가 정의 된 경우 (Windows에서 드라이브 문자 또는 \로 시작하거나 Unix / Linux 시스템에서 /로 시작) 또는 현재 디렉토리 (. 또는 ..로 시작)에 상대적인지 여부에 관계없이 include_path가 모두 무시됩니다.


@diEcho : "완전히 잘못된"이유를 알 수 있습니까? 여러 전문가 급 응용 프로그램에서 사용하고 있으며이 방법은 실제로 모든 상황에서 작동하는 유일한 방법입니다. PHP 매뉴얼 에도 자세히 나와 있습니다. 그렇게 잘못 될 수는 없습니다.
gaborous

첫 번째 줄은 완전히 잘못되었습니다. ..경로의 중간 (상대 / 절대)을 추가 할 수 없습니다 .
diEcho

@diEcho 나는 또한 당신에게 PHP 매뉴얼을 알려줘야합니다
gaborous

..포함의 중간에 사용되는 단일 예를 말해주십시오 . 항상 포함의 첫 번째 부분이되어야한다
diEcho

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… 전문가 수준의 ERP / CRM을위한 전문가 수준의 모듈. 당신이 무슨 말을하는지 모를 때는 말을해서는 안됩니다.
gaborous

16

../하나의 디렉토리, 두 개의 디렉토리 ../../또는 심지어 세 개의 디렉토리에 대해 반복합니다 ../../../.

상수를 정의하면 디렉토리 구절을 거꾸로 드릴 수 있으므로 혼동을 줄일 수 있습니다.

다음과 같이 몇 가지 상수를 정의 할 수 있습니다.

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

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

'BD'또는 '기본 디렉터리'를 사용하면 다음과 같이 보입니다.

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

밝히다(); 참고



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

의 각 인스턴스는 ../하나의 디렉토리를 백업 / 백업하는 것을 의미합니다.


9

다음은 다른 디렉토리에 액세스하는 방법입니다.

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

7

당신은 할 수 있습니다 ../../directory/file.txt-이것은 두 개의 디렉토리로 돌아갑니다.

../../../-이건 3 번입니다. 기타



6

그러나 사용자가 파일을 선택할 수 있도록하는 데 매우 주의하십시오. 예를 들어, 파일을받는 것을 허용하고 싶지는 않습니다.

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

또는 기타 민감한 시스템 파일.

(죄송합니다. 제가 리눅스 시스템 관리자로 일한 지 오래되었습니다. 이 파일은 제 기억에 민감한 파일 이라고 생각 합니다.)




4

php7을 사용하는 경우 레벨 매개 변수가 2 인 dirname 함수를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

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

두 번째 매개 변수 "2"는 얼마나 많은 레벨이

dirname 참조


3

오버 디렉토리 포함은 프록시 파일로 처리 할 수 ​​있습니다.

  • 뿌리
  • ..... | __ 웹
  • ..... | ......... | _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';

2

시도해보십시오 ../../. 두 개의 디렉토리를 백업하므로 적절하게 수정할 수 있습니다. 먼저 루트 디렉터리로 이동 한 다음 필요한 디렉터리에 액세스합니다.

예 :에 root/inc/usr/ap있고 다른 디렉토리가 root/2nd/path있습니다. 다음 과 같이 path디렉토리에 액세스 할 수 있습니다 ap. ../../2nd/path먼저 원하는 디렉토리보다 루트로 이동하십시오. 작동하지 않는 경우 공유하십시오.


2

포함 /시작 부분에를 포함하면 포함이 사이트 루트의 경로로 사용됩니다.

사이트가 http://www.example.com/game/forum/files/index.php 인 경우 http://www.example.com으로 해석되는 /includes/boot.inc.php에 포함을 추가 할 수 있습니다 . /includes/boot.inc.php .

..일부 웹 서버에서 비활성화되므로 순회에 주의 해야합니다. 또한 사이트를 새 컴퓨터 / 호스트로 이동하려고 할 때 문제가 발생하고 구조가 약간 다릅니다.


2

이 시도

이 예는 하나의 디렉토리 뒤로

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

이 예는 두 개의 디렉토리 뒤입니다.

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

정확히 똑같습니다 ;-) 두 번째에서 '../../images/yourimg.png'를 의미한다고 생각하십니까?
Edwin

OPPS는 내 실수
rehan 라지 푸트 족

1

나는 당신의 대답을 보았고 구문이있는 include 경로를 사용했습니다.

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

및 http 서버 (Apache 2.4.3)에서 내부 오류 500을 반환했습니다.

내가 경로를 변경했을 때

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

모든 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.