주제: [URL Rewrite관련] CGI 환경을 지원하지 못하는 문제
http://www.tattertools.com/bbs/view.php … amp;no=160
http://www.tattertools.com/bbs/view.php … amp;no=143
일전에 태터 게시판에 썼던 내용인데,
이곳 게시판에 버그를 써야만 ticket 등록이 된다고 해서 올립니다.
현재 태터툴즈는 Apache + mod_php 환경에서만 작동하며 php를 CGI로 가동할 경우에는 작동하지 않습니다.
(이상하게 국내에서는 mod_php 보다 더 나은 퍼포먼스를 보여주는 FastCGI 방식을 잘 사용하지 않더군요.
다들 메모리가 넉넉한 서버를 쓰시나봐요.)
에러의 원인은 .htaccess 의 RedirectRule 과 태터 프로그램 내의 $_SERVER['REDIRCET_URL'] 입니다.
[1] 태터 프로그램의 문제
일단 path 방식의 멀티유저로 설치했다고 전제합니다.
blog/index.php 881행을 보면
$url=isset($_SERVER['REDIRECT_URL'])?$_SERVER['REDIRECT_URL']:$_SERVER['SCRIPT_NAME'];
이라는 문장이 있습니다.
여기뿐만 아니라 이런 식의 문장은 태터툴즈 전체에 걸쳐 무려 162군데에나 존재합니다. (함수로 만들어두는게 나을 듯 싶을 정도.)
아무튼 여기서 이 $url을 해석하여 어느 블로그인지를 찾게 되는데요.
원래 개발자가 의도했던 $url 값은 /user/123 처럼 유저명을 포함한 주소일텐데
정작 CGI환경에서는 $_SERVER['REDIRECT_URL']에는 indxe.php, /blog/owner/index.php 따위의 실행파일 주소가 들어가기 때문에
$url을 아무리 해석한다고 해도 원하는 결과를 얻을 수 없습니다.
$url=$_SERVER['REQUEST_URI']; 또는
$url=isset($_SERVER['REDIRECT_QUERY_STRING'])?$_SERVER['REDIRECT_QUERY_STRING']:$_SERVER['QUERY_STRING'];
와 같은 식으로 바꾸어야만 /blog/index.php 가 제대로 작동하게 됩니다.
[2] .htaccess 의 문제
http://도메인/유저명/owner 와 같은 주소를 입력하면
No input file specified. 라는 에러 메시지가 뜹니다.
이 에러메시지는 .htaccess 에서 RedirectRule을 제대로 정의하지 못했다는 것을 의미합니다.
즉 /blog/owner/index.php 를 찾는 대신 /blog/유저명/owner/index.php를 찾으려고 하기 때문에 발생하는 것입니다.
.htaccess 의 맨마지막줄 RedirectRule이 그렇게 정의되어있습니다.
[3] 제안하는 해결책
위의 2가지 문제를 각각 처리한다고 하여, 태터툴즈가 CGI 환경에서 제대로 작동할지는 의문입니다.
자세히 살펴보진 않았지만, URL을 해석하는 부분이 태터 프로그램 곳곳에 있는 듯 하고
그렇다면 각 PHP 페이지에서 $url 을 해석하고 redirect 시키는 것을 일일이 확인해야 할 것이기 때문입니다.
보다 손쉬운 방법은 .htaccess 룰을 단순화시키고, 각 페이지에 들어있는 $url 해석부분을 제거하는 것입니다.
즉 .htaccess 파일 내용으로
rewriteCond %{REQUEST_FILENAME} !-f
rewriteCond %{REQUEST_FILENAME} !-d
rewriteRule ^(.*)$ tt.php?$1 [L,QSA]
이라고만 해두고
tt.php 파일 내에서 $_SERVER['REQUEST_URI']를 해석하게끔 함으로써
.htaccess 가 하던 역할을 tt.php 로 떠넘기는 것입니다.
(그외의 php 페이지에서는 $url을 분석해서 redirect 하는 부분이 필요없겠죠.)
이와 같이 했을때, http://도메인/blog/123 과 같은 주소를 입력할 경우
$_SERVER 환경변수는 다음과 같습니다.
[REQUEST_URI] => /blog/123
[QUERY_STRING] => /blog/123
[REDIRECT_QUERY_STRING] => blog/123
[REDIRECT_URL] => /tt.php
[SCRIPT_NAME] => /tt.php
[SCRIPT_FILENAME] => /실제디렉토리/tt.php
이를 참조하여 tt.php 를 작성하면 될 것 같습니다.
(개발자님께서는 mod_rewrite를 사용하지 말자는 뜻으로 오해하시는거 같던데,
그런 뜻이 아니라 URL 처리 방식의 문제를 지적하는 것입니다.)
더군다나 이렇게 할 경우, mod_rewrite를 사용하지 못하는 경우일지라도
tt.php 대신 index.php 를 사용하면
"/원하는URL" 대신 "/?원하는URL" 과 같은 주소를 사용할 수 있습니다.
[4] IIS의 경우
ISAPI_rewrite (http://www.isapirewrite.com/, 유료버전) 라든가
Ionic’s Isapi Rewrite Filter (http://cheeso.members.winisp.net/dl/Ion … writer.zip)
http://www.qwerksoft.com/products/iisrewrite/
http://www.motobit.com/help/url-replace … ewrite.asp
등의 여러 사이트를 통해
mod_rewrite가 IIS에서 작동하게끔 할 수 있습니다.
위에서 지적한 것과 마찬가지로 태터툴즈 프로그램과 RewriteRule은 변경되어야 할 것입니다.
우수한 (2006-04-19 09:13:05)에 의해 마지막으로 수정