url error cgi 설정 문제

antimine의 이미지

적당한 곳은 아니지만 어디 여쭐 곳이 없어서 이곳에 질문드립니다.

cafe24서버에서 무버블 타입을 사용하고 있습니다.

캐릭터셋은 utf-8입니다. 언제나 항상 늘!

url-error.cgi 를 돌리고 있습니다. (맨 아래 코드가 있습니다.)

가령 제 홈페이지 주소에서

http://사이트/없는한글주소

일 때, 404에러를 뱉어내게 되면 .htaccess의 설정에서

서치를 통해서 쿼리값을 "없는한글주소"로 주게 되어 있습니다.

http://사이트/mt-search.cgi?RegexSearch=1&search=없는한글주소

이런 식으로요. 그리고 본문에서 결과를 찾아줍니다.

euc-kr서버에서는 제대로 잘 작동했습니다.(그때도 블로그의 캐릭터 셋은 utf-8이었습니다. 언제나 utf-8)

그런데 utf-8 서버로 옮기면서는 이게 동작하지 않습니다.

Not Found
The requested URL /한글 was not found on this server.

Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Apache/1.3.37p3 Server at antimine.kr Port 80

이렇게 에러를 뱉어 냅니다.

/한글 <-요걸 봐서는 한글을 제대로 인식하지 못하는 것 같은데요.

가령 익스플로러에서 주소값을 utf-8로 항상 보냄을 해제하면
제대로 되거든요. 그리고 쿼리값이 영문일 때는 제대로 동작을 합니다.

헌데 euc-kr서버 에서는 어느 상황에서나 제대로 됐습니다.(파폭이든 모질라든 IE든, euc-kr서버를 사용할 때도 캐릭터 셋은 utf-8이었습니다.)

원인이 뭘까요?
아파치 상에서 뭔가 다른 점이 있는 것 같은데, 어떻게 해결 할 수 있을까요?
제가 확인해 봐야 할 게 뭐가 있을까요?
카페24측에 뭘 확인 하도록 요청할 수 있을까요?

url-error.cgi 코드입니다.
--------------

#!/usr/bin/perl -w
#------------------------------------------------------------------
# Copyright (c) 2005, Lee, Joon (http://alogblog.com/)
# This code is released under a Creative Commons License.
# (http://creativecommons.org/licenses/by-nc-sa/2.5/)
#------------------------------------------------------------------

### ##########################################################################
### 아래 부분을 자신의 환경에 맞게 설정해야 합니다.

BEGIN { unshift(@INC, '/home/hosting/xxxxxxxx/www/extlib'); }
# (mt home)/extlib 폴더의 절대경로를 적어줍니다.

my $my_encoding = 'utf8';
# 해당 블로그가 UTF-8 인코딩을 사용하면 'utf8', EUC-KR 을 사용하면 'euc-kr'.

my $webrootPath = '/home/hosting/xxxxxxx/www';
# 서버상의 웹루트의 절대 경로를 적습니다. 끝에 '/'는 붙이지 않습니다.

my $archivesPath= '';
# 웹루트에서부터의 아카이브 폴더까지의 상대경로입니다. 끝에 '/'는 없습니다.
# MT3.2에서부터 archives 경로는 선택사항이 되었습니다. 따로 아카이브를 위한
# 폴더를 정하지 않은 경우에는 그냥, '/blog' 정도가 됩니다.

my $searchCGI = '/mt-search.cgi?RegexSearch=1&search=';
# 자신의 (mt home)/mt-search.cgi 의 경로(웹루트로부터)를 맞게 수정해줍니다.
# 그리고 IncludeBlogs=1 에서의 1은 검색하고자 하는 블로그의 ID입니다.
# 어떤 임의의 요구된 페이지가 서버에 존재하지 않으면, 404 Not Found Error페이지를
# 보이는 대신에, MT의 검색페이지로 넘어가게 해주는 겁니다. 이때 한글 URL부분(대부분
# 엔트리 제목에 해당하는)을 검색어로 만들어서 넘게 줍니다.
# RegexSearch이하는 그대로 둡니다.

my $minimum_search_keywords = 3;
# 위의 경우에 "이것은_테스트_글입니다"와 같은 한글제목 부분이 "이것은", "테스트",
# "글입니다" 와 같이 공백을 기준으로 각각이 OR로 연결되어 검색되게 됩니다. 이때,
# 너무 짧은 검색어는 검색어로서의 기능이 약하기때문에 최소 몇 바이트 이상되는
# 단어만 검색어로 사용하고자 하는 의미입니다. 한글의 경우 EUC-KR을 사용한다면
# 한글자가 2바이트, UTF-8을 사용한다면 3바이트를 차지하므로 만약 3으로 정한다면,
# 한글자만으로 된 단어는 검색어에 넣지 않겠다는 뜻입니다.

### 설정 끝
### ##########################################################################

use CGI qw/:standard/;
use Encode qw(encode decode);
use Encode::Guess qw(euc-kr utf-8);
use URI::Escape;

my $path = $ENV{"REDIRECT_URL"};
my $tmp_encode = guess_encoding($path);

$q = new CGI;

if($tmp_encode->name ne $my_encoding) {
$path = encode($my_encoding, $tmp_encode->decode($path));
$f = $webrootPath . $path;
if(-e $f) {
$path = uri_escape($path);
$path =~ s/%2f/\//gi;
print $q->redirect($path);
}
else { gotoSearch($path); }
}
else { gotoSearch($path); }

sub gotoSearch {
my $path = shift;
for(split(/\//, $archivesPath)) {
$path =~ s/$_//gi;
}
$path =~ s/${archivesPath}//i;
$path =~ s/\/[\d]+//g;
my @p = split(/[_\/]/, $path);
$key = '';
for(@p) {
$key .= $_.'|' if(length $_ >= $minimum_search_keywords);
}
$key =~ s/\|$//;
$key =~ s/^\.//;
$key = uri_escape($key);
print $q->redirect(${searchCGI}.$key);
}

klutzy의 이미지

브라우저에서 서버로 보낸 URL이 euc-kr인데, 서버는 utf-8이 올 거라고 기대하고 있어서 발생하는 현상이에요. (그래서 IE에서 UTF-8로 보내기 옵션을 켜면 잘 되는 거에요.) 딱히 아파치 단에서 잘못한건 아닙니다.

<a href=URL> 같은 경우라면 URL에 퍼센트 인코딩( http://ko.wikipedia.org/wiki/%ED%8D%BC%EC%84%BC%ED%8A%B8_%EC%9D%B8%EC%BD%94%EB%94%A9 )을 해 주어야 잘 돌아가겠지만, 브라우저 주소창에 직접 한글을 쓰는 경우는 어쩔 수 없습니다. 서버쪽에서 그게 utf-8인지 euc-kr인지 찍어서 맞춰야죠. 퍼센트 인코딩이 되어 있지 않으면, 브라우저가 어떤 인코딩을 해서 보낼지 예측할 수가 없거든요. IE만 해도 UTf-8로 보낼지 EUC-KR로 보낼지 설정이 멋대로 되고요.

JuEUS-U의 이미지

서버가 인코딩을 인식하든 말든지간에,
일단은 에러스크립트로 들어가게 되어있습니다...

스크립트 디버깅을 떠야 정확한 원인을 알 수 있을겁니다.

참고로 첫번째 if문 안의 내용에서 에러가 났을 가능성이 높습니다.
특히 디코딩 -> 인코딩 과정에서...

antimine의 이미지

우선 본문에서 "주소값을 utf-8로 보내지 않음을 해제" 이 부분을
"항상 utf-8로 보냄 해제"로 수정했습니다.

다른 모듈 설치도 안 돼서 그냥 euc-kr서버에 재설치했습니다.

그랬더니 제대로 동작합니다. (제 홈의 캐릭터 셋은 utf-8입니다.)

utf-8로 보냄을 해제해도 강제해도 FF에서도 어디서든 제대로 동작합니다.

이게 서버 상에 어떤 모듈이 있고 없고의 차이인지, perl encode 모듈 버전과의 궁합인지 대체 모르겠네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.