다운로드 - PHP에서 내 URL의 "응용 프로그램 루트"를 얻으려면 어떻게합니까?



강좌 언어 (6)

내 URL이 http://www.server.com/myapp/stuff/to/see 이고 디스크의 디렉토리 구조가 htdocs/myapp/* 경우 어떻게 /myapp 부분을 ​​추출 할 수 있습니까? 또한 응용 프로그램 폴더가없고 응용 프로그램 루트가 '/'이면 어떻게됩니까? 그 값을 얻기위한 미리 정의 된 변수가 있습니까?

내가 원하는 것은 요청 URI의 /myapp 을 다듬을 수있는 함수이다. 그래서 나는 /stuff/to/see 만 남았다. 그리고 만약 애플리케이션을 서버 문서 루트로 옮기고 싶다면 /stuff/to/see/stuff/to/see 로 리턴되도록 애플리케이션을 결정해야한다.

내 디렉토리 구조는 다음과 같습니다.

application
  |-config
    |-config.inc.php
library
  |-autoload.class.php
public
  |-css
  |-img
index.php

그래서, index.php에서, 내가 위에 물어 보는 것을 얻는 방법을 알고 싶습니다.


Answers

비슷한 문제가 발생했습니다. 기본적으로 PHP에서 'A.php'파일이 상대 경로를 사용하여 리소스를 참조하는 경우 상대 경로의 접두사로 사용되는 현재 경로 위치는 'A.php'가 포함 된 최상위 상위 PHP입니다.

A.php 자체가 상위 상위이거나 A.php가 최상위 상위 폴더와 동일한 폴더에있는 경우 문제가되지 않습니다. 그러나 그렇지 않으면 수입을 깨뜨릴 것입니다.

내가 찾은 최선의 해결책은 DIR (파일의 현재 위치를 알려주는)을 사용하여 명시 적으로 참조를 절대적으로 만드는 것이고, 예를 들어 DIR에 대해이 위치에서 참조 할 것이다. "/../help.php"를 참조한다. A.help보다 1 단계 위에 앉아있는 파일 help.php.


http://www.server.com/myapp/stuff/to/see 사용하여 페이지에 액세스하고 웹 서버의 문서 루트가 /something/htdocs/ 현재 local 경로는 /something/htdocs/myapp/stuff/to/see .

get /something/htdocs/myapp/ 결과를 얻는 확실한 해결책은 없습니다. 왜냐하면 어떤 경로를 가져야하는지 명확한 정의가 없기 때문입니다. 이를위한 몇 가지 규칙이있을 때 알려 주면 무언가를 생각해 낼 수도 있지만 계산이 없으면 볼 수있는 유일한 경로는 다음과 같습니다.

  • http://www.server.com/myapp/stuff/to/see
    $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
  • /something/htdocs/myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_FILENAME']
  • /something/htdocs/
    $_SERVER['DOCUMENT_ROOT']
  • /myapp/stuff/to/see
    $_SERVER['REQUEST_URI']
  • /myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_NAME'] 와 (과) $_SERVER['PHP_SELF']

웹 루트 의 경우 여러 답변에서 지적한 DOCUMENT_ROOT 가 있습니다. 응용 프로그램 루트의 경우 시스템에서 응용 프로그램의 어떤 폴더가 루트 폴더인지 알 수있는 방법이 없습니다. 수동으로 설정해야합니다.

대부분의 응용 프로그램은 dirname(__FILE__); 사용하여 응용 프로그램 루트를 정의합니다 dirname(__FILE__); 또는 구성 설정을 저장하고 응용 프로그램 전체에서 사용할 수있는 상수에 저장합니다.


이 시도:

 echo dirname(__FILE__);

여기서 __FILE__ 은 현재 실행중인 스크립트의 이름이고 dirname 은 폴더 / 응용 프로그램 폴더를 가져옵니다.

기타 옵션 :

echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir

PHP.net에서


<?php
define('ABSPATH', dirname(__FILE__));

응용 프로그램의 루트 폴더에있는 파일에 다음 코드를 입력하고 모든 페이지로드시이를 포함시킵니다.

그런 다음 $path = ABSPATH . '/path/to/file.php'; 만하면 $path = ABSPATH . '/path/to/file.php'; $path = ABSPATH . '/path/to/file.php'; 로컬 복사본이 하위 디렉터리 folder 에 있는지 여부에 관계없이

애플리케이션에 이미 모든 페이지로드에 포함 된 파일이있는 경우 위의 코드를 해당 파일에 놓으면 작동합니다.

해당 파일의 위치에 따라 추가 dirname() 호출을 추가해야 할 수도 있습니다. webapp의 루트에서 전달하는 각 디렉토리에 하나씩 추가하십시오.

예를 들어, webapp이 /webapp/ 있고 "global include"가 /webapp/includes/framework/init.php/webapp/includes/framework/init.php 위의 코드를 다음과 같이 수정해야합니다.

define('ABSPATH', dirname(dirname(dirname(__FILE__))));

즉 : 웹 응용 프로그램 루트 ( includes/framework )에서 두 개의 추가 폴더로 인해 dirname() 이 2 번 호출 includes/framework

설명

위의 코드는 하나의 파일에 있고 하나의 파일은 웹 응용 프로그램에만 있어야합니다. 이 파일은 각 페이지로드시에 포함되어야합니다.

처리 전에 포함되어있는 파일 (구성 파일 또는 기타 파일)이 이미있는 경우 해당 파일에 해당 코드를 복사하여 붙여 넣을 수 있습니다.

dirname() 호출의 수는 코드를 복사하고 붙여 넣은 파일이 웹 응용 프로그램의 루트 디렉토리와 얼마나 관련이 있는지에 따라 다릅니다. 위의 예제에서 웹 응용 프로그램의 루트가 ~ 로 표시된다고 가정합니다.

~/abspath.php 내 코드를 복사하여 붙여 넣으면 하나의 dirname() 호출이 필요합니다.

~/includes/abspath.php 코드를 복사하여 붙여 넣으면 두 개의 dirname() 호출이 필요합니다.

~/includes/config/abspath.php 코드를 복사하여 붙여 넣으면 3 개의 dirname() 호출이 필요합니다. 이제 최종 위치라고 해봅시다.

~/index.php 에서 다음을 수행합니다.

<?php
require_once('includes/config/abspath.php');

ABSPATH 액세스 할 수 있습니다.

~/dir/someOtherPage.php 에서 다음을 수행합니다.

<?php
require_once('../includes/config/abspath.php');

ABSPATH 액세스 할 수 있습니다.

이것이 바로 각 페이지로드에 포함 된 파일이 이미 있다면 위 코드를 삭제하는 것이 더 간단하다는 것입니다. 그에 따라 dirname() 호출의 양을 수정해야합니다. 다시 말하지만,이 코드는 오직 하나의 파일에 있어야합니다.

그런 다음 DOCUMENT_ROOT ABSPATH 를 제거하는 간단한 문제 인 URL 경로를 가져 오십시오.

$docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/');
define('RELADDR', substr(ABSPATH, strlen($docRoot));

 We can use date function and set default timezone.

 <?php

  date_default_timezone_set("Asia/Kolkata");
  echo "Today is " . date("Y/m/d") . "<br>";
  echo "Today is " . date("Y.m.d") . "<br>";
  echo "Today is " . date("Y-m-d") . "<br>";
  echo "Today is " . date("l");
  echo "The time is " . date("h:i:sa");

 ?>




php