며칠전에
IE7 과 mod_url 문제 수정 이라는 글에서 IE7 에서 한글 URI 를 사용할 경우 mod_url 과의 충돌로 무한 루프가 발생하는 문제를 수정하여 포스팅을 했었습니다.
그 과정에서, 301 로 재접속을 시킬때, IE7 의 재변환을 막기 위하여 url encoding 을 하여 문제를 해결했는데, 그 해결을 위해 사용했던 코드가 php raw_url_encode 함수를 수정하여 처리를 했습니다. 그런데, PHP license 와 Apache license 가 충돌이 나는 이유로 어떻게 할까 고심을 하다가 완전히 새로 작성을 하게 되었습니다.
apache 는 URL 에 대하여 다음의 구조체를 가집니다.
struct request_rec {
..
char *filename;
char *path_info;
char *uri;
struct stat finfo;
char *unparsed_uri;
uri_components parsed_uri;
..
}
위에 나열된 변수들이 URL 과 관련되었으며, filename 은 system 상의 경로를 가지고 있습니다. 그래서 이것을 이용하여
- uri 를 iconv 로 convert 를 함
- uri convert 가 실패하면, 그냥 file not found 로 전송
- filename 을 convert 함.
- filename convert 를 실패하면 301 로 변환된 URI 를 이용한 주소로 재접속 하도록 함.
- convert 된 filename 이 시스템상이 있는지 확인
- 있으면 정상 출력 없으면 file not found
와 같이 처리되도록 변경이 되었습니다. 딱 1가지 경우만 빼고는 재접속을 하지 않게 되는 변경이 된것입니다. 다만, 4번 과정에서 재접속을 해야 하는데, 이 경우는 다음과 같습니다.
서버에서 다음과 같이 Alias 가 결려 있을 경우입니다.
Alias /xxx/한글/ /home/httpd/html/한글/
이 설정과 같이, Alias 이름에 한글이 들어가 있으면 apache 구조체의 filename 변수에 실제 경로 부분에는 EUC-KR 이 그리고 URI 에 해당 되는 부분에는 UTF-8 이 들어가기 때문에 iconv 에서 실패를 하게 됩니다. Alias 가 해석되는 과정에서 이게 섞이게 되는데, 이 경우는 재전송을 통하여 EUC-KR 로 들어오게 하는 방법외에는 없더군요 --;
뭐 하여튼, 이런 구조로 완전히 재설계가 되었습니다. :-)
문제는, 이 수정 사항을 KLDP.NET 의 공식 mod_url 에 반영을 해야 하는데, 패치 주고받고 하면서 하기가 상당히 귀찮네요. 코드도 완전히 바뀌었고, 그냥 mod_url2 로 fork 를 할까도 살짝 고민중입니다. ^^;
어쨌든.. apache1/2 용 모듈 2개 모두 현재 재작성이 되었고, apaceh2 용 모듈은 실제 테스트는 아직 해 보지 못했습니다. 다만 apache 2.2 의 소스를 참고하여 API 는 맞추어 놓았습니다.
재작성된 mod_url 은
http://cvs.oops.org/index.cgi/mod_url/?cvsroot=OOPS-Apache 에서 apache 1 용은 1.17, apache 2 용은
1.10 을 받으시면 됩니다.
Comments List
autoip가 이름을 바꾼것인가 봐요..