[pakino]님이 남기신 글:
>정말 감사드립니다...밑에 URL관련 질문한 사람입니다.
>결국 다시 404페이지로 왔네요..^^;
>저도 404페이지로 만들어봤는데요..
>
>문제가 있네요..
>explore에서 옵션중 HTTP 오류표지를 체크(디폴트체크입니다)하면 404페이지를 설정해도 못 찾더군요..
>이문제를 해결할 수 없을까요..?
>이 것만 되면 문제없이 해결할수 있는데요..
========================================
...
좀 생각해 보니 굳이 check.php?id=$1 이런식으로
redirect 할 필요는 없더군요.
예를들어 파일 이름이 foobar.php 이라면,
- foobar.php?id=someid
- foobar.php/?id=someid
- foobar.php/id=someid
- foobar.php/id/someid/others
- foobar.php/id/someid/others/
- foobar/id=someid <-- 이것도 가능함
- foobar/id/someid
...
이런 변칙적인(?) 사용이 모두 가능하더군요.
PATH_INFO 환경변수에 '/id=someid' 같은 값이 들어갑니다.
한번 테스트해 보세요.
따라서,
아파치 설정 파일에서
RedirectMatch ^/([a-z]{1,}[a-z0-9-]*)$ /check.php/$1
이와 같이 설정하고,
(좀더 제한적인 ID 표현 정규표현식 요구됨)
check.php 파일을 다음과 같이 코딩합니다.
-- check.php ---------------
<?php
##
## this file name check.php
##
## check redirect path infomation
##
## set to apache 'httpd.conf' file at <virtualhost xxxx>
##
## RedirectMatch ^/([a-z]{1,}[a-z0-9-]*)$ /check.php/$1
##
if(preg_match(';^/.+$;',$_SERVER[PATH_INFO]))
{
if(is_dir($_SERVER[DOCUMENT_ROOT].$_SERVER[PATH_INFO]))
{
header('Location: '.$_SERVER[PATH_INFO].'/');
exit;
}
$id = str_replace('/','',$_SERVER[PATH_INFO]);
// some check $id in mysql database
//
if($existid) // 이부분을 직접 코딩하세요.
{
header('Location: /index.html?id='.$id);
exit;
}
}
echo 'wrong path or file not exits';
exit;
?>
---------------------------------
이것이 마지막이 답변이 될것 같네요... ^.9
좀더 오류없이 정확하게 리다이렉트 할려면
체크하는 가상 호스트와 실제로 서비스하는 가상호스트를
서로 구별하여 꼬이지 않도록 체크하는것이
좋습니다.
즉,
앞이 코드를 보면 알겠지만, 어떤 유저의 id 가 'aaa'이고
DocumentRoot에서 디렉토리가 aaa 가 존재하면
aaa 디렉토리로 이동해 버리는 단점이 있습니다.
따라서,
다음과 같이 check 할 가상 호스트를 따로 만들어 체크하는
것이 더 좋을 것 같네요.
[권장 방법]
check.xxx.com 이라는 가상호스트를 만듭니다.
<VirtualHost xxxx>
ServerName club.xxx.com
...
RedirectMatch ^/([a-z]{1,}[a-z0-9-]*)$ http://check.xxx.com/check.php/$1
...
</VirtualHost>
<VirtualHost xxx>
ServerNAme check.xxx.com
DocumentRoot /some/path/to/check/docs
</VirtualHost>
-- /some/path/to/check/docs/check.php ----
<?php
$id = str_replace('/','',$_SERVER[PATH_INFO]);
// some check $id in mysql database
//
if($existid)
{
header('Location: http://club.xxx.com/index.html?id='.$id);
exit;
}
exit;
?>
후자가 더 간단하죠? |