[완료] mod_rewite 사용시 해당 룰셋을 두번 거치는 문제
글쓴이: vamf12 / 작성시간: 금, 2007/04/13 - 7:03오후
아우.. ㅠ_ㅠ 어딜 봐도 이런 내용에 관한 이야기는 없어서 질문 드립니다.
일단 .htaccess의 내용은 간단하게 두줄 입니다
RewriteEngine On RewriteRule ^(.*)$ view.sh?$1 [L]
URI로 들어오는 모든 내용을 CGI의 아규먼드로 붙여서 호출 하고 싶은 겁니다.
그런데 로그를 찍어 보면.. -_-
[rid#825cb94/initial] (3) [per-dir /home/book/] strip per-dir prefix: /home/book/1548 -> 1548 [rid#825cb94/initial] (3) [per-dir /home/book/] applying pattern '^(.*)$' to uri '1548' [rid#825cb94/initial] (2) [per-dir /home/book/] rewrite 1548 -> view.sh?1548 [rid#825cb94/initial] (3) split uri=view.sh?1548 -> uri=view.sh, args=1548 [rid#825cb94/initial] (3) [per-dir /home/book/] add per-dir prefix: view.sh -> /home/book/view.sh [rid#825cb94/initial] (2) [per-dir /home/book/] strip document_root prefix: /home/book/view.sh -> /view.sh [rid#825cb94/initial] (1) [per-dir /home/book/] internal redirect with /view.sh [INTERNAL REDIRECT] [rid#825f3f4/initial/redir#1] (3) [per-dir /home/book/] strip per-dir prefix: /home/book/view.sh -> view.sh [rid#825f3f4/initial/redir#1] (3) [per-dir /home/book/] applying pattern '^(.*)$' to uri 'view.sh' [rid#825f3f4/initial/redir#1] (2) [per-dir /home/book/] rewrite view.sh -> view.sh?view.sh [rid#825f3f4/initial/redir#1] (3) split uri=view.sh?view.sh -> uri=view.sh, args=view.sh [rid#825f3f4/initial/redir#1] (3) [per-dir /home/book/] add per-dir prefix: view.sh -> /home/book/view.sh [rid#825f3f4/initial/redir#1] (1) [per-dir /home/book/] initial URL equal rewritten URL: /home/book/view.sh [IGNORING REWRITE]
저렇게 두바퀴 돌아서 결국 foor.bar.com/view.sh 이렇게만 항상 출력 됩니다.
foor.bar.com/1548로 요청을 하면
1. 1548 -> view.sh?1548 한다음
2. view.sh?1548 -> view.sh 로 잘립니다.. -_-?
modrewrite 설정중에 [L] - L플래그를 사용하면 이제 끝~ 아닌가요?
Forums:
음, 제 생각에는
음, 제 생각에는 (물론 제가 틀렸을 수도 있습니다만)
L플래그는 "이번 시점에" 그 아래 있는 룰을 검사하지 말고 종료하라는 얘기이니까요... L플래그를 for루프 안에 있는 break문에 비유해보면, break의 의미는 "현재 진입해서 반복수행하고 있던 for루프를 종료하라"는 것이지, "이 for루프에 두번 다시 진입하지 말아라"는 것과는 무관한게죠.
저 경우에는 "처음으로 for루프 진입"해서 1548이 view.sh?1548이 되었고, 나온 결과를 가지고 다시 "두번째로 for루프 진입"해서 view.sh 가 (뒤에 ?1548은 쿼리스트링이니까 빼고) 다시 view.sh?view.sh 가 된 거죠. 바꾸기 전과 바꾼 후가 동일하게 view.sh이기 때문에 "더 이상 for루프 돌리지 말자"는 판정이 나온 거고요. (로그의 마지막 줄)
rule을 view.sh?$1 처럼 view.sh 뒤에 쿼리로 붙이게 했으니 그나마 두번만에 끝났지, view.sh/$1 처럼 url로 붙이게 했으면 아마 1548->view.sh/1548->view.sh/view.sh/1548->... 이렇게 반복하다가 rewrite limit에 걸려 서버에러와 함께 끝나지 않았을까 싶습니다.
이건 제가 방금 확인차 테스트해본 건데, /a.html 또는 /b.html 을 브라우저로 불러보면, L플래그가 있지만 이건 무한루프 돌다 서버 에러 납니다. :-)
좋은 하루 되세요!
오 감사합니다.
mod_rewrite 묘듈 자체가 바뀌지 않을 때까지 재귀적으로 계속 도는 형태 였군요.. ㅠ_ㅠ
서브디렉토리 하나 추가해서 일단 해결했습니다.
RewriteRule ^(Foor)/(.*)$ Bar.sh?$1/@2 [L]
맘에 들지는 않지만 동작은 무난하게 되는군요 ^^
룰셋이 한번한 사용되는 것이 아니라 바뀌는 것이 없을때 가지 돌다니..
좋은 점도 있고, 나쁜점도 있는데... 영 사용하기 께름직 하네요.. ㅠ_ㅠ
알지도 못하면서
알지도 못하면서 호기심이 땡겨 끄적입니다.
라는 룰은 좀 이상한가요 ?
바뀌는게 없을 때까지 돈다면, 바뀌는 게 없도록 해주면...
말씀하신 것처럼
말씀하신 것처럼 첫번째 룰로 view.sh 를 먼저 처리해주고, 그 외의 것은 view.sh를 붙이도록 바꿔주면 될 것 같습니다.
그런데 bushi님이 쓰신 룰은 (특히나 두번째 것은) 아마 잘 안 될 것 같습니다. URL뒤에 붙는 "?어쩌고저쩌고"는 쿼리스트링이기 때문에 룰 검사할 때 없는 셈 치더라고요. 그걸 몰라서 예전에 꽤나 끙끙댔던 적이...
좋은 하루 되세요!
http://httpd.apache.org/docs/
http://httpd.apache.org/docs/2.3/mod/mod_rewrite.html
에서 보면 .htaccess에 넣을 경우 좀 다르게 처리되는군요.
Per-directory Rewrites에 보면 상위 디렉토리를 처리하기 위해 위 로그에서 보듯이
per-dir prefix 제거한 상태로 패턴을 적용하고 다시 더해지는데 이 때 초기 URL 정보가
바뀐다는데 있는 것 같습니다. 그러니까 새로운 rule인지 알고 다시 적용하는데 이 부분은
좀 더 똑똑하게 처리할 수도 있을 것 같은데요.
댓글 달기