PHP 브라우저 언어 설정 기반 페이지 자동 포워딩 구현 방법
페이지 정보

본문
PHP 브라우저 언어 설정 기반 페이지 자동 포워딩 구현 방법
Q.
웹 브라우저의 언어 설정 코드를 확인하여 방문자 국가별 페이지로 자동 포워딩하는 PHP 구현 방법과 쿠키 활용법을 확인합니다.
PHP 브라우저 언어 설정 기반 페이지 자동 포워딩 방법
웹 브라우저가 서버에 전달하는 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 전역 변수를 활용하여 접속자의 기본 언어 설정(한국어, 영어, 일어, 중국어 등)을 판별하고, 조건문과 header 함수 또는 HTML Meta Refresh를 이용해 각 국가별 페이지로 자동 리다이렉트할 수 있습니다.
1. 전역 변수 확인 및 개념
웹 브라우저는 기본 인코딩 타입 및 언어 설정 정보를 서버로 전송합니다. 한국어의 경우 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 변수 값이 ko로 전달되며, 영어는 en, 일본어는 ja, 중국어는 zh 등으로 확인됩니다.
2. 페이지 포워딩 구현 방법
[방법 1] 조건문과 정규식을 활용한 리다이렉트 및 쿠키 설정$_SERVER['HTTP_ACCEPT_LANGUAGE'] 값을 정규식으로 검사하여 언어별 프레임 페이지로 이동시키고, 사용자의 언어 상태를 유지하기 위해 쿠키를 설정하는 예시입니다.
<?php
// 한글 방문자의 경우 kr_frame으로 이동
if(preg_match('/ko/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
if((!preg_match('/korean/', $_COOKIE['lang'])) && (!preg_match('/english/', $_COOKIE['lang']))) {
$lang = 'korean';
setcookie("lang", $lang, time() + (3600 * 24) * 365, "/");
}
header("Location: http://example.com/kr_frame.php");
exit;
}
// 영문 방문자의 경우 en_frame으로 이동
else {
if((!preg_match('/korean/', $_COOKIE['lang'])) && (!preg_match('/english/', $_COOKIE['lang']))) {
$lang = 'english';
setcookie("lang", $lang, time() + (3600 * 24) * 365, "/");
}
header("Location: http://example.com/en_frame.php");
exit;
}
?>
[방법 2] 다국어(국문·일문·중문·영문) 분기 처리
여러 언어 코드를 elseif 조건문으로 세분화하여 각각 지정된 경로로 리다이렉트합니다.
<?php
// 한글 방문자
if(preg_match('/ko/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
header("Location: /lang/korean.php");
exit;
}
// 일본어 방문자
elseif(preg_match('/jp/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
header("Location: /demo/lang/japanese.php");
exit;
}
// 중국어 방문자 (기본)
elseif(preg_match('/zh/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
header("Location: /lang/chinese.php");
exit;
}
// 중국어 간체
elseif(preg_match('/zh-ch/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
header("Location: /lang/chinese_ch.php");
exit;
}
// 중국어 번체
elseif(preg_match('/zh-hk/', $_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
header("Location: /demo/lang/chinese_hk.php");
exit;
}
// 영문 방문자 (기본값)
else {
header("Location: /demo/lang/english.php");
exit;
}
?>
[방법 3] substr과 switch 문, HTML Meta Refresh 활용
문자열 앞의 2자리 코드를 잘라내어 switch 문으로 분기하고, meta 태그를 이용해 리프레시 방식으로 포워딩하는 예시입니다.
<?php
$var = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
switch($var) {
case "ko":
echo "<meta http-equiv='Refresh' content='0; URL=/demo/lang/korean.php'>";
break;
case "ja":
echo "<meta http-equiv='Refresh' content='0; URL=/demo/lang/japanese.php'>";
break;
case "zh":
echo "<meta http-equiv='Refresh' content='0; URL=/demo/lang/chinese.php'>";
break;
default:
echo "<meta http-equiv='Refresh' content='0; URL=/demo/lang/english.php'>";
break;
}
?>
3. 주의사항
header()함수를 사용하여 페이지를 이동시킬 때는 브라우저에 어떠한 HTML 출력이나 공백, 줄바꿈 등의 텍스트가 전달되기 이전에 실행되어야 합니다. 출력이 발생한 이후에는 헤더를 재전송할 수 없습니다.
PHP 브라우저 언어 설정 기반 자동 포워딩 가이드
- 내 상황: 그누보드 또는 PHP 기반 웹사이트에서 방문자의 브라우저 언어 설정 코드(
$_SERVER['HTTP_ACCEPT_LANGUAGE'])를 파악하여 국가별 페이지로 자동 이동시키고자 할 때 - 선택 기준:
- 쿠키를 활용해 방문자의 언어 선택 상태를 일정 기간 유지하며 세부 프레임 페이지로 이동하려면 [방법 1] 선택
- 국문, 영문, 일문, 중문 등 다국어 경로를 체계적으로 분기하려면 [방법 2] 선택
- 문자열 앞 2자리를 잘라내어 HTML
meta태그 방식으로 가볍게 리프레시하려면 [방법 3] 선택
- 다음 행동: 선택한 PHP 코드를 메인 진입 파일(예:
index.php) 최상단에 배치합니다. PHP의header()함수는 브라우저에 HTML 태그나 공백 등 어떠한 출력도 전달되기 전에 실행되어야 합니다. 따라서 해당 코드를 파일의 최상단(첫 줄<?php이전)에 배치하고, 파일 내에 불필요한 공백이나 줄바꿈이 포함되지 않도록 주의해야 합니다.
실전 FAQ
Q. header() 함수를 실행할 때 'Headers already sent' 오류가 발생합니다.
- 예외 및 원인:
header('Location:...')코드가 실행되기 전에 HTML 태그, 공백 문자, 혹은 PHP 파일 맨 앞의 빈 줄이 먼저 출력되면 헤더가 이미 전송되어 리다이렉트가 불가능합니다. - 대안: PHP 파일의 맨 첫 줄
<?php바로 이전에 어떠한 공백이나 BOM도 존재하지 않는지 확인하고, HTML 출력보다 상단에서 스크립트가 완전히 처리되도록 배치하세요.
Q. 사용자가 브라우저 언어와 다른 언어 페이지를 수동으로 선택했을 때 고정하는 방법은 무엇인가요?
- 대안: 첫 접속 시에만
$_SERVER['HTTP_ACCEPT_LANGUAGE']로 자동 포워딩을 수행하고, 사용자가 언어 선택 버튼을 눌렀을 때는 쿠키(setcookie)에 언어 값을 저장합니다. 이후 접속부터는 브라우저 언어보다 쿠키 값을 우선 검사하도록 로직을 수정하면 사용자의 수동 선택을 유지할 수 있습니다.
함께 보면 좋은 글
- 그누보드 IE 브라우저 접속 시 안내 페이지 리다이렉트 구현 방법
- 그누보드4 브라우저 종료 시 자동 로그아웃 설정 방법
- 크롬 브라우저에서 그누보드 비밀번호 입력란이 보이지 않는 문제 해결 방법
참고자료
기타 참고자료
- 이전글PHP 세션(SESSION) 관리 가이드: 생성, 사용 및 삭제 26.10.08
- 다음글CentOS 6.8 환경에서 yum을 이용한 PHP 5.3.3 설치 가이드 26.10.07
댓글목록
등록된 댓글이 없습니다.