[첫화면으로]UseModWiki소스수정/SlashLinks처리

마지막으로 [b]

1. URL에 "?" 대신에 "/" 를 사용
1.1. 이슈
1.2. 사용법
1.3. 부작용
1.4. wiki.pl 수정
1.5. 추가 업데이트 내역
1.6. 사용자 의견

1. URL에 "?" 대신에 "/" 를 사용

주소에 "?" 대신에 "/" 를 사용해서 등을 처리할 수 있게 해보자.

(이렇게 해야 하는 이유는... IE의 버그 때문에 UTF-8로 URL이 넘어올때 "?"뒤의 쿼리 스트링이 잘못된 코드로 넘어오기 때문이다. 유니코드논의/파일명인코딩UseModWiki소스수정/UTF-8로인코딩된쿼리처리 참고)

1.1. 이슈

접근 방법

현재 문제점:

참고:

1.2. 사용법

1.3. 부작용

1.4. wiki.pl 수정

sub InitRequest {
    ...
    $CGI::POST_MAX = $MaxPost;
###############
### replaced by gypark
### file upload
#   $CGI::DISABLE_UPLOADS = 1;  # no uploads
    $CGI::DISABLE_UPLOADS = 0;
###
###############
### slashlinks 처리                     - 여기서부터 추가
    if ($SlashLinks && (length($ENV{'PATH_INFO'}) > 1)) {
        $ENV{'QUERY_STRING'} .= '&' if ($ENV{'QUERY_STRING'});
        $ENV{'QUERY_STRING'} .= substr($ENV{'PATH_INFO'}, 1);
    }
# slahslink 관련 패치이나, POST 에서 에러가 난다 - 일단 보류
#   if   ($ENV{'REQUEST_METHOD'} eq 'GET') {
#       $q = new CGI($ENV{'QUERY_STRING'});
#   } elsif($ENV{'REQUEST_METHOD'} eq 'POST') {
#       read (STDIN, $q, $ENV{'CONTENT_LENGTH'});
#       $q = new CGI($q);
#   }
    $q = new CGI;
##### 여기까지
    $q->autoEscape(undef);

###############
### added by gypark
### file upload
    if ($q->cgi_error() =~ m/^413/) {
        print $q->redirect(-url=>"http:$ENV{SCRIPT_NAME}".&ScriptLinkChar()."action=upload&error=3");
        exit 1;
    }
    $UploadUrl = "http:$UploadDir" if ($UploadUrl eq "");
###
###############
    $Now = time;                     # Reset in case script is persistent
    $ScriptName = pop(@ScriptPath);  # Name used in links
### slashlinks 처리                     - 여기서부터 추가
    if ($SlashLinks) {
        my $numberOfSlashes = ($ENV{'PATH_INFO'} =~ tr[/][/]);
        $ScriptName = ('../' x $numberOfSlashes) . $ScriptName;
    }
    $ScriptName = $FullUrl if ($FullUrl ne '');
#####  여기까지
    $IndexInit = 0;                  # Must be reset for each request
    $InterSiteInit = 0;
    ...
}

SlashLinks 옵션을 켰을 때, 로그인할 때는 로그인 폼에서 "디렉토리/wiki.pl"을 부르기 때문에 쿠키의 path가 "디렉토리/"가 되는데, 로그아웃하는 시점에서는 URL이 "디렉토리/wiki.pl/action=logout"이라서 path가 "디렉토리/wiki.pl/"이 된다. 따라서 한번 로그아웃하고 나면, 브라우저를 재시작하거나 쿠키를 삭제하지 않는 이상 두 개의 서로 다른 쿠키가 충돌하여서 로그인이 되지 않게 된다.

이 문제를 해결하기 위해 명시적으로 쿠키의 path값을 지정하도록 하였다. 하는 김에, 차후에 mod_rewrite를 써서 홈페이지 주소를 단순화하였을 때도 써먹을 수 있도록 그런 경우의 처리도 해 주었음. (한다고는 했는데, rewrite 룰을 어떻게 주느냐에 따라서 제대로 안 될 수도 있을 듯)

sub GetHttpHeader {
    ...
            . "&randkey&" . $SetCookie{'randkey'}
            . ";";
### slashlinks 지원 - 로긴,로그아웃시에 쿠키의 path를 동일하게 해줌     여기서부터 추가
        my $cookie_path = $q->url(-absolute=>1);
        if ($ENV{'SCRIPT_NAME'} eq $cookie_path) {      # mod_rewrite 가 사용되지 않은 경우
            $cookie_path =~ s/[^\/]*$//;                    # 스크립트 이름만 제거
        } else {                                        # mod_rewrite
            if ($ENV{'PATH_INFO'} ne '') {                  # wiki.pl/ 로 rewrite 된 경우
                $cookie_path =~ s/$ENV{'PATH_INFO'}$//;
            } else {                                        # wiki.pl? 로 rewrite 된 경우
                $cookie_path =~ s/$ENV{'QUERY_STRING'}$//;
            }
        }
        $cookie .= "path=$cookie_path;";
##### 여기까지
        if ($SetCookie{'expire'} eq "1") {
            $cookie .= "expires=Fri, 08-Sep-2010 19:47:23 GMT";
        }
    ...
}

1.5. 추가 업데이트 내역

ext1.107a

1.6. 사용자 의견

하나를 고치면 다른 게 걸리고... 아 왜 버그가 있는 건 브라우저인데 그것 때문에 이 고생을 해야 해 ㅠ,.ㅠ
-- Raymundo 2007-2-5 9:54 pm

음, 우려와는 달리 잘 동작하는 것 같군요. 그런데 좀 전에 로그아웃했다가 다시 들어왔더니만 로그인이 계속 풀려서 덜컥 했습니다만, 웹마를 재실행하니까 잘 됩니다. URL이 wiki.pl 로 끝나지 않고 뒤에 계속 슬래쉬가 붙는 것이 쿠키 처리에 영향을 주는 게 아닌지 조금 걱정스럽긴 하네요. 그 외에는 별 문제 없어 보입니다.
-- Raymundo 2007-2-6 2:48 am

으음... 로긴을 할 때는 쿠키가 /cgi-bin/wiki/ 에 대해서 설정되고, 로그아웃을 할 때는 /cgi-bin/wiki/wiki.pl/ 에 대해서 설정되는 바람에, 다시 로긴을 하더라도 서로 다른 두 쿠키 사이에 충돌이 일어나는 듯.
-- Raymundo 2007-2-6 3:24 am

이 문제는 해결했는데, 이번에는 트랙백에서 생각지도 못한 문제 발견. (별 문제가 없는 게 아니었군)
-- Raymundo 2007-2-6 11:39 am

SlashLinks 를 켠 상태에서, 유즈모드에서 유즈모드로 트랙백을 보냈을 때 내용이 깨짐. 트랙백 대상 주소에 "?"가 없기 때문에 POST 방식으로 보내어서 그런 것 같긴 한데, 유즈모드->태터(태터 주소에도 물음표 없음)로 보내는 건 또 괜찮다. 태터->유즈모드도 괜찮고...
-- Raymundo 2007-2-6 11:49 am

트랙백 내용이 깨지는 것은 캐릭터셋을 지정해주지 않았기 때문이었고, 간단히 해결.
-- Raymundo 2007-2-6 1:25 pm

다른 문제 발견, URL에 "/"대신 "%2F"로 인코딩되어 있으면 오히려 못 찾는다. OTL
-- Raymundo 2007-2-6 1:26 pm

"/"는 인코딩하지 않게 함.
-- Raymundo 2007-2-6 7:56 pm
이름:  
Homepage:
내용:
 

위키위키분류

마지막 편집일: 2008-8-31 1:19 am (변경사항 [d])
1170 hits | Permalink | 변경내역 보기 [h] | 페이지 소스 보기