common.php 파일에 urldecode 부분 궁금증

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
common.php 파일에 urldecode 부분 궁금증

QA

common.php 파일에 urldecode 부분 궁금증

답변 1

본문

    if (G5_DOMAIN) {
        $p = @parse_url(G5_DOMAIN);
        $p['path'] = isset($p['path']) ? $p['path'] : '/';
        $urlencode = rtrim(G5_DOMAIN, '/') . '/' . ltrim(urldecode(preg_replace("/^" . urlencode($p['path']) . "/", "", $_SERVER['REQUEST_URI'])), '/');
    }

로그인 후 이전 페이지로 돌아가기 위해 

login.php?url=<?php echo $urlencode;?>

이렇게 코딩을 했습니다.

첫번째 문제점은 게시판 이름이 숫자로만 구성된 경우 예를들면....
짧은 주소로 "https://www.abc.com/2404001" 인 경우
$urlencode의 값은 "https://www.abc.com/bbs/login.php?url=https://www.okmobile.kr%2F404001"
"2"가 잘려서 나옵니다. 게시판 이름이 숫자인 경우 앞에 1자리가 잘리네요.

두번째 문제점은 도메인 주소가 "https://www.abc.com/" 처럼 뒤에 루트가 붙을 경우
"https://www.abc.com/bbs/login.php?url=https://www.gunwi.net/renew%2F/" 처럼
루트 기호가 두개가 붙는다는것..

그래서 소스를 아래처럼 단순화 하였더니 두가지 문제가 해결되네요.
if (isset($_REQUEST['url'])) {
    $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\[\]\\x80-\\xff]|i', '', trim($_REQUEST['url']));
    $urlencode = urlencode($url);
} else {
    $url = '';
    $urlencode = urlencode($_SERVER['REQUEST_URI']);


왜 DOMAIN을 체크하는지 이유가 궁금합니다.

이 질문에 댓글 쓰기 :

답변 1

1. G5_DOMAIN을 체크해야 하는 이유:

멀티 도메인이나 서브도메인 환경에서 URI를 정확히 계산하고,

각 도메인에 맞는 절대 경로를 생성하여 일관된 URL을 처리하기 위해서죠.

즉, 여러 도메인 또는 경로 기반 사이트 구조를 지원하고,

동일한 코드베이스를 사용하는 경우에도 도메인에 종속된 올바른 경로를 반환하기 위해~

 

2. 기존 코드의 문제점:

- 숫자로만 구성된 게시판 이름: preg_replace와 urlencode/urldecode 처리 중,

  숫자형 경로에서 첫 글자가 잘리는 문제가 발생.

- 루트 경로 중복: rtrim 및 ltrim이 겹쳐서 슬래시(/)가 중복되는 현상이 발생.

 

3. 단순화된 코드로 문제를 해결한 이유:

단순화된 코드는 $_REQUEST['url']을 직접 가져와 정규식으로 필터링하고,

URL을 그대로 urlencode 처리하여 복잡한 경로 조작 없이 문제를 해결.

이를 통해 불필요한 디코딩과 재인코딩 과정을 제거해 오류를 방지.

.

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 0
© SIRSOFT
현재 페이지 제일 처음으로