레이블이 rewrite인 게시물을 표시합니다. 모든 게시물 표시
레이블이 rewrite인 게시물을 표시합니다. 모든 게시물 표시

apache httpd rewrite

# httpd rewrite 사용하기

LogLevel warn rewrite:trace3
LoadModule rewrite_module modules/mod_rewrite.so
<IfModule rewrite_module>
    RewriteEngine On

    # RewriteCond 조건에 맞으면 RewriteRule 을 수행한다.
    # localhost 로 요청이 오면
    # RewriteCond %{HTTP_HOST} localhost
    # test.ysoftman.com 호스트로 요청이 오면
    RewriteCond %{HTTP_HOST} test\.ysoftman\.com

    # uri 가 /aaa 가 아니면
    RewriteCond %{REQUEST_URI} !(^/aaa$)

    # 쿼리 문자열 중 param=123 같은 파라미터가 있으면
    # param=value 를 그룹매칭 %1는 param=xxx
    # RewriteCond %{QUERY_STRING} (param=[^&]*)
    # value 만 그룹매칭 %1는 xxx
    RewriteCond %{QUERY_STRING} param=([^&]*)

    # 위 여러개의 RewriteCond 중 마지막(RewriteRule 바로이전) 패턴 매칭 결과를
    # %0 ~ %N(9까지) 로 사용할 수 있다.
    # %0 은 매칭된 전체이고, %1부터는 (xxx) 그룹을 나타낸다.
    # 첫번째 매칭 그룹은 %1 두번째 매칭 그룹은 %2 ... 가 된다.
    # 위 조건에 의해 param=123 의 경우 %1 는 123 이 된다.

    # RewriteRule 의 패턴 패칭 결과는 $0 ~ $9 로 사용할 수 있고,
    # $0 은 매칭된 전체이고, $1부터는 (xxx) 그룹을 나타낸다.
    # 첫번째 매칭 그룹은 $1 두번째 매칭 그룹은 $2 ... 가 된다.
    # /api/apple/lemon/ 인 경우 $1=apple  $2=lemon

    # 자주 사용되는 RewriteRule 플래그
    # R : redirect, 302 상태로 브라우저에게 라디이렉트하도록 한다. fully-qualified URL (http://servername/ 를 포함하는) 로도 설정할 수 있다. R=301 로 하면 301 로도 응답할 수 있다.
    # F : forbidden , 430 으로 응답한다.
    # G : gone, 410 상태로 응답한다.
    # L : last, 이 후 더이상 룰 매칭이 되지 않도록 한다. RewriteRule 이 여러개 사용할 겨우 더이상 L 이후로는 더이상 처리되지 않는다.
    # NC : nocase, 매칭시 대소문자 구별하지 않는다.
    # NE : NoEscape, % 로 이스케이프 되는것을 막는다.

    # test.ysoftman.com/api/apple/lemon?param=123 의 요청인 경우
    # RewriteCond 조건이 참이되어
    # test.ysoftman.com/ysoftman-apple-lemon?test=123 로 라다이렉트 시킨다.
    RewriteRule ^/api/([^/]*)/([^/]*) /ysoftman-$1-$2?test=%1 [NE,R,NC,L]

    # 또는 https://...로 다른 호스트로 리다이렉트 할 경우
    # RewriteRule ^/(.*) https://aaa.bbb.ccom%{REQUEST_URI} [NE,R,NC,L]
</IfModule>


#####


# 이스케이프 처리
# apache httpd 에서는 path 에 url 인코딩 없이 한글이 오면 특수문자로 취급해 escape(\)+hexadecimal(hex) 코드로 처리한다.

# 브라우저를 사용하면 자동 url 인코딩 된다.
http://localhost:8080/%EC%95%84%EC%9D%B4%EC%9C%A0
# httpd access_log
"GET /%EC%95%84%EC%9D%B4%EC%9C%A0 HTTP/1.1" 404 207

# curl 로 url 인코딩 없이 요청하면
curl http://localhost:8080/아이유
# httpd access_log 에는 아이유(utf-8, 한글자3byte) 총 9byte 가 hex-escape 된다.
"GET /\xec\x95\x84\xec\x9d\xb4\xec\x9c\xa0 HTTP/1.1" 404 207

# rewrite 모듈 사용시 \x 가 %로 이스케이프되는데 이를 막으려면
# mod_rewrite 모듈의 NE 플래그를 사용해야 한다.
https://httpd.apache.org/docs/2.4/rewrite/flags.html#flag_ne

# 에러 로그에 rewite 확인
tail -f logs/error_log

# NE 플래그 없을때
redirect to http://localhost:8080/ysoftman-%ec%95%84%ec%9d%b4%ec%9c%a0 [REDIRECT/302]

# NE 플래그 있을때
redirect to http://localhost:8080/ysoftman-\xec\x95\x84\xec\x9d\xb4\xec\x9c\xa0 [REDIRECT/302]