[완료] mod_rewite 사용시 해당 룰셋을 두번 거치는 문제

vamf12의 이미지

아우.. ㅠ_ㅠ 어딜 봐도 이런 내용에 관한 이야기는 없어서 질문 드립니다.
일단 .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플래그를 사용하면 이제 끝~ 아닌가요?

raymundo의 이미지

음, 제 생각에는 (물론 제가 틀렸을 수도 있습니다만)

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에 걸려 서버에러와 함께 끝나지 않았을까 싶습니다.

RewriteRule ^a.html$ b.html [L]
RewriteRule ^b.html$ a.html [L]

이건 제가 방금 확인차 테스트해본 건데, /a.html 또는 /b.html 을 브라우저로 불러보면, L플래그가 있지만 이건 무한루프 돌다 서버 에러 납니다. :-)

좋은 하루 되세요!

vamf12의 이미지

mod_rewrite 묘듈 자체가 바뀌지 않을 때까지 재귀적으로 계속 도는 형태 였군요.. ㅠ_ㅠ

서브디렉토리 하나 추가해서 일단 해결했습니다.

RewriteRule ^(Foor)/(.*)$ Bar.sh?$1/@2 [L]

맘에 들지는 않지만 동작은 무난하게 되는군요 ^^

룰셋이 한번한 사용되는 것이 아니라 바뀌는 것이 없을때 가지 돌다니..

좋은 점도 있고, 나쁜점도 있는데... 영 사용하기 께름직 하네요.. ㅠ_ㅠ

bushi의 이미지

알지도 못하면서 호기심이 땡겨 끄적입니다.

RewriteRule ^(view.sh)\?  - [L]
RewriteRule ^(.*)$      view.sh?$1 [L]

라는 룰은 좀 이상한가요 ?

바뀌는게 없을 때까지 돈다면, 바뀌는 게 없도록 해주면...

RewriteRule ^(.*)\?(.*)  \1\?\2 [L]
RewriteRule ^(.*)$      view.sh?$1 [L]

raymundo의 이미지

말씀하신 것처럼 첫번째 룰로 view.sh 를 먼저 처리해주고, 그 외의 것은 view.sh를 붙이도록 바꿔주면 될 것 같습니다.

그런데 bushi님이 쓰신 룰은 (특히나 두번째 것은) 아마 잘 안 될 것 같습니다. URL뒤에 붙는 "?어쩌고저쩌고"는 쿼리스트링이기 때문에 룰 검사할 때 없는 셈 치더라고요. 그걸 몰라서 예전에 꽤나 끙끙댔던 적이...

좋은 하루 되세요!

경의 이미지

http://httpd.apache.org/docs/2.3/mod/mod_rewrite.html
에서 보면 .htaccess에 넣을 경우 좀 다르게 처리되는군요.
Per-directory Rewrites에 보면 상위 디렉토리를 처리하기 위해 위 로그에서 보듯이
per-dir prefix 제거한 상태로 패턴을 적용하고 다시 더해지는데 이 때 초기 URL 정보가
바뀐다는데 있는 것 같습니다. 그러니까 새로운 rule인지 알고 다시 적용하는데 이 부분은
좀 더 똑똑하게 처리할 수도 있을 것 같은데요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.