현재 위치: > 최신 기사 목록> 상대 경로를 올바르게 식별 할 수없는 parse_url을 처리하는 방법

상대 경로를 올바르게 식별 할 수없는 parse_url을 처리하는 방법

gitbox 2025-05-27

매일 웹 개발에 PHP를 사용할 때 Parse_url ()은 URL을 구문 분석하고 다양한 구성 요소를 얻는 매우 일반적인 기능입니다. 그러나 많은 개발자 들이이 기능을 사용하여 "상대 경로"를 처리 할 때 예상치 못한 결과를 낳을 것이며,이 기능에 버그가 있는지 의심 할 수도 있습니다. 실제로, 문제는 parse_url () 자체가 아니라 사용 시나리오에 대한 오해가 있다는 것입니다.

이 기사는 parse_url () 의 행동과 상대 경로를 올바르게 처리하는 방법에 대한 깊은 이해를 안내합니다.

1. 문제 배경

parse_url () 에 대한 공식 설명은이 기능의 매개 변수가 법적 URL이어야한다는 것을 분명히 나타냅니다. 즉, 절대 URL을 구문 분석하는 데 더 적합합니다. 상대적인 경로를 통과하면 반환 된 결과는 예상 한 것이 아닐 수 있습니다.

예를 살펴 보겠습니다.

 $url = "/path/to/resource?foo=bar#section";
var_dump(parse_url($url));

산출:

 array(1) {
  ["path"]=>
  string(19) "/path/to/resource?foo=bar#section"
}

parse_url () 가 분할되지 않음 ? foo = bar#section 이지만 전체 문자열을 경로로 취급합니다. 그 이유는 들어오는 것이 상대적인 경로이기 때문에 Parse_url ()는 이러한 부분을 올바르게 나누는 방법을 모릅니다.

2. 상대 경로를 다루는 올바른 방법

상대 경로에서 쿼리 문자열 또는 조각 (#)을 구문 분석 해야하는 경우, 실행 가능한 방법은 먼저 절대 URL로 변환하는 것입니다. 가상 프로토콜과 호스트 이름을 스 플라이싱하여 구현할 수 있습니다.

 $relativeUrl = "/path/to/resource?foo=bar#section";
$absoluteUrl = "http://gitbox.net" . $relativeUrl;
$parts = parse_url($absoluteUrl);

// 단조를 제거하십시오 scheme 그리고 host
unset($parts['scheme'], $parts['host']);

var_dump($parts);

산출:

 array(3) {
  ["path"]=>
  string(17) "/path/to/resource"
  ["query"]=>
  string(7) "foo=bar"
  ["fragment"]=>
  string(7) "section"
}

이런 식으로 우리는 우리가 원하는 결과를 얻을 수 있습니다.

3. 추가 캡슐화 처리 기능

이런 종류의 시나리오를 자주 만나면 상대 경로를 처리하기 위해 도우미 기능을 캡슐화 할 수 있습니다.

 function parse_relative_url($url) {
    // 그렇다면 / 시작하는 길,추가 할 도메인 이름을 위조하십시오
    if (strpos($url, '/') === 0) {
        $url = 'http://gitbox.net' . $url;
        $parts = parse_url($url);
        unset($parts['scheme'], $parts['host']);
        return $parts;
    }

    // 다른 형식이라면,계속 구문 분석할지 여부를 선택하거나 예외를 던질 수 있습니다.
    throw new InvalidArgumentException("Only relative paths starting with '/' are supported.");
}

Call example:

 $info = parse_relative_url('/test/path?x=1#top');
print_r($info);

산출:

 Array
(
    [path] => /test/path
    [query] => x=1
    [fragment] => top
)

4. 요약

Parse_url ()은 절대 URL을 구문 분석 할 때 매우 신뢰할 수 있지만 상대 경로에 직면 할 때 성능이 제한되어 있습니다. 가짜 도메인 이름을 일시적으로 스 플라이싱하면이 제한을 우회하여 쿼리 및 파편과 같은 정보를 얻을 수 있습니다.

이것은 해킹이 아니라 기능 설계의 경계에 대한 합리적인 응답입니다. 도구의 경계를 이해하는 것은 도구에 버그가 있는지 맹목적으로 의심하는 것보다 중요합니다. 이 기사가 트랩을 적게 얻는 데 도움이되기를 바랍니다!