# 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
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$)
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>
# 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
# 브라우저를 사용하면 자동 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]
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]