[완료] apache의 rewrite 과정에서 uri string에 #이 포함되어 있는 경우
.... RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php/$1 [L]
php에서 codeigniter를 이용하여 개발하고 있으며, fancy url을 위해서 위와 같은 rewrite rule을 사용하고 있습니다.
간략하게 설명드리자면 codeigniter는 위와 같이 root의 index.php로 모든 request를 받고 apache의 path_info나 request_uri
등의 환경변수등으로 해당 request를 해석합니다.
1. 환경
apache 2.0
php 4.4.x
2. 문제상황
그런데 다른 uri string의 경우는 이상이 없으나, 중간에 #이 포함되면 정상동작을 하지 않습니다.
여러 방법으로 문제가 되는 지점을 확인해보니, 예를 들어 다음과 같은 uri string을 입력받는다고 할 때,
http://www.foo.com/content/search/케이엘디피#some_extra_strings
라면, 실제 path_info나 request_uri등으로 받아오는 값은
/content/search/케이엘디피
뿐입니다. (즉 #some_extra_strings가 빠져 있습니다.)
php가 apache로부터 받아오는 환경변수 자체부터 저렇게 잘려서 오는걸 보니 apache의 문제인듯해서
살펴보았습니다. 아무래도 mod_rewrite에서 리디렉션을 할 때에 # 뒷부분은 주석처리되는 것으로 인식해서
잘리는 것으로 생각됩니다.
3. 찾아 본 해결방법
3-1 NPH-CGI 스크립트를 사용 (http://httpd.apache.org/docs/2.0/ko/misc/rewriteguide.html)
링크의 중간쯤에 나오는데, mod_rewrite의 xredirect를 이용하여 다른 cgi 스크립트로 요청을 넘겨버리는 것으로 보입니다.
그리고 이게 가장 명시적으로 제가 처한 문제의 해결책을 제시하는 것 같습니다.
... 그러나... 스크립트를 사용할 만 한 환경이 못됩니다. 현재 웹서버가 수십대이고 전담 관리팀이 따로 있어서
스크립트를 하나 사용하겠다고 하면 이것저것 고려하고 테스트한다고 시간이 오래 걸릴게 분명하거든요. -_-;;
3-2 NE flag 사용
rewrite rule에 no escape 하겠다는 flag 인 것 같은데, 이걸 넣어도 원하는대로 정상동작을 안하더군요..
4. 자..
다시 정리하자면, apache에서 rewrite를 할 때에 uri string에 포함된 # 이하 부분도 주석처리되지 않고 함께 정상적으로 rewrite
되었으면 좋겠습니다.
어떻게 하면 될까요?
http://labs.apache.org/webarc
http://labs.apache.org/webarch/uri/rfc/rfc3986.html#fragment
URI RFC에 의하면, 클라이언트 측에서 fragment를 떼어내고 서버에 요청하도록 돼있는 것 같습니다. 다시 말해 fragment에는 클라이언트에게만 의미가 있는 정보를 담으라는 뜻이죠.
자바스크립트를 사용해서 쿼리 스트링에 넣어 리다이렉트 하는 방법 말고는 딱히 방법이 없을 듯 합니다.
---8< 서명 -----------------
애니메이션 감상 기록 http://animeta.net/
흐흐.. 역시 딱히
흐흐.. 역시 딱히 답이 없군요. ^^;;
좋은 링크 감사합니다. ^^
--->
데비안 & 우분투로 대동단결!
--->
데비안 & 우분투로 대동단결!
댓글 달기