common.php 파일에 urldecode 부분 궁금증
관련링크
본문
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 처리하여 복잡한 경로 조작 없이 문제를 해결.
이를 통해 불필요한 디코딩과 재인코딩 과정을 제거해 오류를 방지.
.