1

주제: "저장할 수 없었습니다" 문제

증상:
HTML 편집 모드에서 <object></object> 만 써서 글을 등록하는 경우 - 기존 글을 편집하는 경우도 포함 - "저장할 수 없었습니다" 와 같은 에러메세지가 발생함.

이 문제는 WantU 씨가 언급한 http://forum.tattersite.com/ko/viewtopic.php?id=6611 문제와 같습니다.


WantU씨와 같은 서버를 사용하고 있고, 제가 서버 관리자라서 도대체 뭐가 문제인지 서버 로그를 뒤졌습니다. 일단 apache의 access log에는 다음과 같이 기록이 남았습니다.

221.139.**.** - - [18/Sep/2008:22:31:01 +0900] "POST /owner/entry/finish/992?__T__=1221744638015 HTTP/1.1" 404 - "http://blog.laphir.net/owner/entry/edit/992" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; MAXTHON 2.0)"

포스트를 올릴 때는 HTTP response가 200이지만, 저 문제가 발생하는 경우에는 404 로 뜹니다.

텍스트 큐브 소스 중에서 404를 return 하는 곳이 어디 있나 전부 확인해서 어느 놈이 문제인가 확인했는데, 다음의 코드가 문제였습니다.

lib/config.php:         header('HTTP/1.1 404 Not Found');

// Basic POST/GET variable validation.
if (isset($IV)) {
    if (!Validator::validate($IV)) {
        header('HTTP/1.1 404 Not Found');
        exit;
    }
}

post할 때 key-value 페어에서 뭔가 잘못 보내지는 듯 하네요.


클라이언트: IE 6.0 with WindowsXP sp3 한글판. Maxthon 2.0 을 깔아서 쓰고 있음.
  user-agent 문자열은 위의 서버 로그를 보시면 됩니다.

서버: fedora core 8
  PHP 5.2.6 (cli) (built: May  8 2008 08:53:44)
  Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
  httpd-2.2.9-1.fc8
  mysql  Ver 14.12 Distrib 5.0.45, for redhat-linux-gnu (i386) using readline 5.0

이렇게 사용 중입니다.

텍스트 큐브 버전은 1.7.4 : Risoluto 및 1.7.6 Release Candidate 1 입니다.
둘 다 동일한 증상이 있네요.
인터넷 캐쉬 혹은 cookie 문제인가 싶어 모두 지우고 새로 해봐도 같은 증상입니다.
구글 크롬에서도 같은 증상입니다.
파폭3은 잘 되네요. -_-;;;

자 이 놈을 어찌해야 할까요?

laphir (2008-09-23 23:16:54)에 의해 마지막으로 수정

2

답글: "저장할 수 없었습니다" 문제

MacOSX 10.5.5 / Safari 3.1 에서 테스트 했을 때 아무 문제가 없었습니다.^^

일단 확실한 방법은 실제 request 의 내용으로 뭐가 날라갔는지 확인하는 방법입니다. 어떤 디버그 툴이 있는지 제가 모르기 때문에, 이렇게 한 번 해보시기 바랍니다. /interface/owner/entry/edit/index.php 를 열어서

   319                                     this.save = function () {
   320                                         if(this.nowsaving == true)
   321                                             return false;
   322                                         this.nowsaving = true;
   323                                         var data = this.getData(true);
   324                                         if (data == null) {

이렇게 생긴 부분이 있는데 (중간 저장하는 부분입니다) 여기서 var data = this.getData(true); 이 아랫줄에
alert(data);
라고 한 줄 추가하셔서, 중간저장때 뜨는 팝업에 content값이 멀쩡하게 있는지 알려주세요.^^

짐작가는 부분으로는 encodeURIComponent 가 브라우저별 동작이 다른게 아닌가 싶습니다. (스펙에는 그런 부분이 없지만) 해당 태그를 스트리핑 해 버려서 결과적으로 content값이 비어버리게 되는데, 텍스트큐브의 Input Validator 에서는 content가 비어 있는 경우 정상적인 데이터가 안 넘어 왔기 때문에 404를 돌려주는게 아닌가... 싶네요.

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

3

답글: "저장할 수 없었습니다" 문제

<object></object> 만 넣고 테스트해본 결과입니다.
겉보기에는 문제 없는거 같은데요.

파이어 폭스3:
visibility=0&starred=0&title=zz&permalink=&content=%3Cobject%3E%3C%2Fobject%3E&contentFormatter=ttml&contentEditor=modern&published=1&category=0&location=%2F&tag=&acceptComment=1&acceptTrackback=1

IE 6.0:
첨부 파일 참고.
겉보기에는 위와 똑같은 문자열 같은데요. 파폭은 저장이 되고, IE는 저장이 안 됩니다.

이렇게 되면, 서버에서 받는 쪽이 문제이지 않을까 싶어서 좀 더 디버깅을 했습니다.
php 나 textcube에 어떤 디버그툴이 있는지 몰라, error_log 함수로 의심 가는 부분에 박아서 로그 확인하는 방법을 썼습니다.

처음에 언급했던, config.php 에서 header 404 를 리턴해버리게 되는 원인인 Validator::validate()가 실패하는 이유를 찾아봤습니다. 여기저기 지웠다 뺐다해서 줄번호가 좀 다를 수도 있는데, 450 번째 줄 근처인 것 같군요. 

                if (array_key_exists(3, $rule))
                    $array[$key] = $rule[3];
                else if (array_key_exists('default', $rule))
                    $array[$key] = $rule['default'];
                else if ((!isset($rule[4]) || $rule[4]) && (!isset($rule['mandatory']) || $rule['mandatory']))
                {
                    error_log( "$key, $rule[0] missing!!" );
                    return false;
                }

에러 로그를 위처럼 삽입했을 때, 서버 에러 로그에는 다음과 같이 남았습니다. 첫줄이 저 error_log에 의해서 남겨진 기록이고, 그 아래부분은 config.php에서 $IV['POST'] 변수에 무슨 값이 들어 있나 확인하기 위해 추가로 출력해본 겁니다.

visibility, int missing!!

visibility: int,0,3
starred: int,0,2
category: int,0
title: string
content: string
contentFormatter: string
contentEditor: string
permalink: string,
location: string,/
tag: string,
acceptComment: Array,0
acceptTrackback: Array,0
published: int,0,1

자, 이제 뭘 해야할까요?

laphir (2008-09-25 04:07:05)에 의해 마지막으로 수정

4

답글: "저장할 수 없었습니다" 문제

IE6에서 테스트 해 본 결과 아무 이상이 없었습니다. sad

생각해 볼 수 있는 가능성이 몇가지 있는데, 혹시 사용하는 IE6에 광고 필터등의 플러그인이 설치되어 있지 않나요? 광고 컨텐츠로 취급해서 클라이언트 단에서 내용을 차단하는게 아닌가 싶습니다.

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

5

답글: "저장할 수 없었습니다" 문제

비슷한 환경이겠지만, 어떤 툴바도 어떤 광고 차단 프로그램도 설치되어 있지 않습니다.

바이러스 프로그램은 Nod32(집) / 회사는 카스퍼스키 입니다.

실시간 감시나 인터넷 감시를 모두 꺼도 동일하게 익스플로러에선 에러가 나네요.

특별히 이상한 프로그램을 깔거나 하진 않았습니다.

6

답글: "저장할 수 없었습니다" 문제

아니오. 그것으로는 구글 크롬에서도 안 되는 이유가 설명이 안 됩니다.

제가 생각하고 있는 가능성은 다음과 같습니다.
1. 서버 설정 혹은 서버 환경 때문에 발생한다.
2. 학교 게이트웨이에서 HTTP 프로토콜을 분석해서 이상하다 싶으면 그냥 차단해버린다.

제가 서버 계정 하나 만들어 드릴테니, 직접 살펴 보시겠습니까?
저는 아무래도 2번인 것 같습니다.

7

답글: "저장할 수 없었습니다" 문제

laphir 작성:

아니오. 그것으로는 구글 크롬에서도 안 되는 이유가 설명이 안 됩니다.

제가 생각하고 있는 가능성은 다음과 같습니다.
1. 서버 설정 혹은 서버 환경 때문에 발생한다.
2. 학교 게이트웨이에서 HTTP 프로토콜을 분석해서 이상하다 싶으면 그냥 차단해버린다.

제가 서버 계정 하나 만들어 드릴테니, 직접 살펴 보시겠습니까?
저는 아무래도 2번인 것 같습니다.

옙~ contact at needlworks dot org 로 메일 부탁드립니다.^^

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

8

답글: "저장할 수 없었습니다" 문제

gmail로 메일을 드렸는데,

Technical details of permanent failure:
Google tried to deliver your message, but it was rejected by the recipient domain. We recommend contacting the other email provider for further information about the cause of this error. The error that the other server returned was: 550 550 5.1.1 <콘텍트 @ 니들웍스 옭>... User unknown (state 14).

라는데요?

laphir (2008-09-26 15:03:49)에 의해 마지막으로 수정