아차피 모듈 개발하는데, 요청들어온 페이지로 그대로 넘어가게 하려면 어떻게 해야 하나요?

keeproll의 이미지

안녕하세요?
아파치 모듈 개발에 대한 포스팅이 너무 없어서 직접 질문 올립니다. ㅠ

아파치 모듈 DSO 를 개발하려고 하는데요
최종 개발까지는 기능이 많지만
아주 간단한 것부터 하려고 합니다.

사용자로부터 Request가 들어오면
해당 Request에 대한 Http Header에 대한 정보 몇가지를 파일로 기록하고
Request 들어온 URI 그대로 화면에 나오게 하려고 하는데요..

Http Header 내용을 기록하는 것 까지는 되었는데
문제는 요청되어온 페이지를 어떻게 보여주느냐 입니다. ㅠㅠ

반대로 Http Header의 내용을 기록하는것을 빼면
그냥 일반적인 아파치의 기능이겠죠..

다른 mod_log 관련 모듈을 사용하는게 중요한게 아니라
Request가 들어오면 DSO 모듈에서 잠시 자기 일 하고 요청 들어온 페이지 그대로 출력하는게
1차 목적이라서요...

mod 만드는 예제들 봐가면서 했는데

httpd.conf에

SetHandler xxxxxx

이 추가되면 루트(/)로 들어오는 모든 Request에 대해 해당 핸들러 xxxxxxx가 동작하는 거 아닌가요?

요약하면
http://localhost/index.html
이라는 요청이 오면 해당 요청에 대한 header 값을 기록하고 index.html 내용을 그대로 보여주는것이고
http://localhost/test/test.html
이라는 요청이 오면 해당 요청에 대한 header 값을 기록하고 /test/test.html 내용을 그대로 보여주는 것 입니다.

전 당연히 해당 페이지가 나올줄 알았는데

소스 마지막에 return OK; 하고 나니 화면엔 아무것도 나오지 않네요;;;

혹시 이 간단한 문제 아시는분 계신가요?

김정균의 이미지

모듈 동작을 filter로 할 수도 있지만, hook api를 이용하여 처리도 가능 합니다. 특정 uri에서 동작할 것이 아니라면 filter로 하는 것 보다 이 방법이 구현이 더 쉽습니다.

http://happython.wordpress.com/2011/02/16/request-processing-in-apache/

에서 대략적인 hook api를 찾으실 수 있을 것이고, mod_spelling 같은 모듈들 참조 하시면 쉽게 만드실 수 있을 겁니다. 내부 처리만 하고 해당 URL을 동작시키는 경우라면 http://svn.oops.org/wsvn/Apache.mod_krisp/trunk/apache2/mod_krisp.c 참조 하셔도 될 것 같습니다. 다만 hook api만 잘 선택 하시면 됩니다.

keeproll의 이미지

알려주신 참고 싸이트 잘 보았습니다.

apxs를 이용해 기본 스켈톤을 생성하면 기본적으로 ap_hook_handler가 생성되는데
알려주신 싸이트에 보니, 특정페이지 호출시 return OK 하더라도 해당 페이지 호출안됨 이라고 되어있어, return을 하더라도 해당 페이지가 출력이 안되는거였네요..

몇가지만 더 질문해도 될까요?

또 한가지 구현하려는게
URL로 요청이 들어오면 같은 서버내의 다른 파일로 forwading 하려는 기능입니다.
(역시 다른 module을 사용하지 않고 직접 해보려고 합니다.)

그냥 단순히 생각해서 page redirect 시키면 되겠다 싶었는데
page redirect 시키면 같은 서버의 파일임에도 불구하고 또다른 요청으로 처리되어
결국 계속 다시 요청이 되어 루프에 빠져버리는 현상이 발생되는 것 같습니다.

제가 해본것으로는
1. ap_table_setn으로 Location을 바꾸어본것
2. ap_internal_redirect 를 이용하여 path를 바꾸어준것

이 두가지 모두 새로운 요청이 되어 루프에 빠져 결국 페이지를 표시할 수 없다는 에러가 나오는듯 합니다.

저는 그냥 단순히 생각해서 page forwading 이니까
http://localhost/a.html 로 요청이 오든 http://localhost/b.html 로 요청이 오든
요청 들어오는것을 http://localhost/result.html로 forwading 하고 싶은것 뿐인데
쉽게 생각하면 hook 함수에서 접근하려는 파일명과 uri만 바꾸어주면
위에서 설명한 함수를 이용하지 않더라도 그냥 처리가 되어야 한다고 생각하는데요..

이것또한 쉽지가 않네요...ㅎㅎ

댓글로 지식을 나누어 주셔서 감사합니다.

추가질문에 대해서도 아시는 분 있으시면 댓글 부탁드립니다.

김정균의 이미지

글을 늦게 보았네요. :-)

원하시는 예제는 http://kldp.net/projects/modurl 코드를 참조 하시면 됩니다. download에서 "BASE for spelling tag"를 단 버전이 전자의 경우로 처리하는 것이고, tag를 달고 있지 않은 버전이 후자의 경우로 처리하는 경우 입니다.

익명 사용자의 이미지

return OK;
대신에
return DECLINED;
하시면 됩니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.