본문

Apache 사용시 URL내의 인코딩된 문자를 읽지 못하는 현상 해결하기

RewriteRule ^index2.php index.php [R] 은 index2.php로 시작되는 모든 요청을 index.php로 변환하도록 의도되었다. 문제는 '../index2.php.foo'나 '../index2.php/f/o/o//'와 같은 URL에서는 동작하는데, '%2f'(urlencode('/')의 결과값)이 존재하게 되면 404오류를 띄우게 된다는 것이다. 이는 아파치 2.2.3과 1.3.33 버전에서 발생한다.

=======================
기본 URL인코딩을 오버라이드 하는 [NE] flag를 사용해보라, 또한 문법은 약간의 변화가 필요하다.
RewriteRule ^index2\.php$ http://www.example.com/index.php [NE,R=302,L] 그리고 플래그를 사용할 때, 302-Found 혹은 301-Moved Permanently 리다이렉트 둘중 하나를 사용하는거에 대해 생각해 보아야 한다. 만약 [R]플래그에 "=30x"와 같은 옵션이 붙지 않는다면 302가 기본으로 지정된다. 이는 검색엔진이 오래된 URL을 가진채로 새로운 내용을 저장한다는 것을 의미한다. 반면 301을 사용한다면 이는 오래된 URL을 새로운 URL로 교체하여 주소를 저장한다.

=======================
이것은 버그는 아니고, 잘못된 URL에 대한 결과로 발생한 것이다. '%2f'는 쿼리문자열에서 사용가능하지만, URL상에서는 사용가능하지 않는다. 원하는 결과를 얻기 위해서는, '/'는 '%252f'으로 인코드 되어야 할것이다. URL자체가 올바르지 않기 때문에 서버는 apache 의 특정모듈이 실행되기도 전에 요청을 거부한다. 나의 경우에는 사용자가 정의한 404오류 페이지마저 보이지 않았다. 자세한 정보는 "RFC2396 - Uniform Resource Identifiers (URI): Generic Syntax"에서 찾아볼 수 있다.

출처 : http://www.webmasterworld.com/apache/3279075.htm



본인의 경우는 VirtualHost를 사용할 떄, 주소에 '%2f'가 포함되어 있으면 404 오류를 낸다는 것이었다. 로그를 보자면
127.0.0.1 - - [08/Aug/2010:22:15:02 +0900] "GET /Artists/ HTTP/1.1" 200 3141
127.0.0.1 - - [08/Aug/2010:22:15:05 +0900] "GET /Artists%2F HTTP/1.1" 404 311

해결방법은 AllowEncodedSlashes 지시자를 사용하는것이다. 이는 URL상에서 인코드 된 '/' 경로분리자가 그대로 처리될 수 있는가에 대해서 결정한다. 기본은 off로 설정되어 있으므로 on으로 맞춰주는것이 필요하다.

자세히 말하자면 AllowEncodedSlashes 지시자는 경로 분리자(%2F는 '/', %5C는 '\')가 URL에 포함될 수 있는가에 대하여 결정하는 역할을 한다. 대개 이런 경우 404(Not Found)오류를 내며 거부된다. AllowEncodedSlashes를 On으로 설정하는것은 PATH_INFO와함께 사용될 떄 유용하다.

헌데 전에 어떤 해킹관련 서적에서 위 문자들이 해킹에 사용될 수도 있다고 표로 만들어서 정리해 준것을 상기해보면, 개발자의 의도도 생각해 보는것이 좋을 것 같다. (..%2F..%2F..%2Fpasswd와 같이 사용될 수 있다.)

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.