Apache를 사용할 때 PHP의 DOCUMENT_ROOT 변수에서 일관되지 않는 후행 슬래시


10

다른 서버 환경에서 PHP $_SERVER['DOCUMENT_ROOT']수퍼 글로벌은 때로 슬래시를 갖지만 때로는 그렇지 않습니다. 이 문제는 Apache DocumentRoothttpd.conf파일에 정의 된 방식과 직접 관련이 있다고 생각했을 것입니다 .

즉, httpd.conf후행 슬래시가 없으면 다음과 같이 생각했습니다 .

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

그런 다음 / var / www / live / current를echo $_SERVER['DOCUMENT_ROOT'] 제공해야합니다

그리고 httpd.conf슬래시가 포함 된 경우 :

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

다음 echo $_SERVER['DOCUMENT_ROOT']해야주고 는 / var / www /에서 라이브 / 현재 /

이것은 Ubuntu 10.04의 경우이지만 RHEL 5.5에서는 $_SERVER['DOCUMENT_ROOT']Apache에 아무것도 정의되지 않은 경우에도 슬래시가 추가됩니다 .

왜 이런 일이 일어나는지 아십니까? 누락 된 구성 매개 변수가 있습니까?


참고로 :

  • RHEL의 PHP 5.3.3 (문제가 발생 함) : PHP 5.3.3 (cli) (내장 : 2010 년 7 월 23 일 16:26:53)
  • Ubuntu의 PHP 버전 (문제 없음) : Suhosin-Patch (cli)가 포함 된 PHP 5.3.2-1ubuntu4.2 (빌드 : 2010 년 5 월 13 일 20:03:45)

답변:


6

가상 호스트간에 슬래시가 변경되는 이유를 모르겠습니다. 그건 그렇고, 그것은 중요합니까? 프로그램에 새 슬래시를 추가하기 만하면 (이중 슬래시가있는 경우 제거) 문제가 해결됩니다.

나는 사용한다

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

4
당신은 단순히 사용할 수 있습니다 $realpath = realpath($_SERVER['DOCUMENT_ROOT']);. 여러 개의 슬래시와 후행 슬래시를 모두 자동으로 제거합니다. 항상 후행 슬래시를 원하면 위의 호출 결과에 슬래시를 연결하십시오 realpath(). 안에는 없습니다.
독감

1
어떤 슬래시 (비교적 최근 XAMPP 설치) : 슬래시을 가지고 ... 그리고 윈도우 7 : 나는 Hosteurope 호스트 (우분투 나는 생각한다) 사이의 동일한 문제 (PHP 5.5)를 확인할 수 있습니다
프랭크 Nocke

rtrim($_SERVER['DOCUMENT_ROOT'],'/\\').'/'realpath가 할 수있는 모든 것보다 약간 빠릅니다.
Frank Nocke


3

Apache 환경의 문서 루트는 여러 곳에서 정의 할 수 있습니다.

예, httpd.conf이러한 설정이 포함되어 있지만이 파일이 기본 구성에 사용되므로 덮어 쓸 수 있습니다.

난 당신이 아래의 가상 호스트 구성을 확인 이동 좋을 것 vhosts.dsites-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'],'/\\').'/'realpath가 할 수있는 모든 것보다 약간 빠릅니다.
Frank Nocke

2

Dom의 대답은이 문제에 대한 해결책이지만 stefanvesca의 진술은 다른 환경에서 이중 '//'가 발생하는 이유입니다. 로컬 컴퓨터에서 가상 호스트를 설정 한 .conf 파일 내에서 정의 된 문서 루트의 끝에 /를 추가했을 가능성이 높지만 다른 환경을 설정 한 사람은 그렇지 않은 경우도 있습니다.

어느 쪽이든, PHP의 $ _SERVER [ 'DOCUMENT_ROOT']를 사용하면 구성의 결과 인 아파치 환경 값을 얻습니다. 한 환경에서는 '/', 다른 환경에서는 '//'가 필요한 이유입니다.


1

DOCUMENT_ROOT에 슬래시가 없다고 가정합니다.

이 값은 웹 서버 구성에서 전달됩니다.

아파치

DocumentRoot /var/www/html

이는 우리가 경로에 추가 할 수있는 슬래시가 있어야 함을 의미합니다.

경로의 어느 곳에서나 이중 슬래시 '//'가 아무런 영향을 미치지 않는다는 것을 알면

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

DOCUMENT_ROOT에 후행 슬래시가 있으면 sysadmin에게 아무런 결과가없는 것을 탓할 수 있습니다.

그리고 안전하게 무시합니까?

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