Apache mod_rewrite의 필수 플래그 이해하기
Apache의 mod_rewrite
모듈은 강력하고 유연한 URL 재작성 기능을 제공하며, 이를 통해 다양한 URL 리디렉션 및 변환 작업을 수행할 수 있습니다. RewriteRule
과 RewriteCond
지시어는 이 모듈의 핵심 구성 요소로, 각 지시어의 끝에 붙는 대괄호([]
) 안의 플래그(flags)는 규칙의 동작 방식을 제어하는 역할을 합니다.
이번 답변에서는 RewriteEngine
에서 RewriteCond
와 RewriteRule
에 사용되는 주요 플래그들의 종류와 그 의미를 예제와 함께 상세히 설명하겠습니다.
1. RewriteRule 플래그
RewriteRule
지시어의 끝에 추가할 수 있는 플래그는 여러 가지가 있으며, 각 플래그는 대괄호 안에 쉼표로 구분하여 여러 개를 동시에 사용할 수 있습니다. 아래에 주요 플래그들을 정리하고 예제를 통해 설명하겠습니다.
1.1 [NC]
(No Case)
- 의미: 대소문자를 구분하지 않고 패턴을 매칭합니다.
- 용도: URL의 대소문자가 혼합되어 있을 수 있는 경우 유용합니다.
예제:
RewriteEngine On
RewriteRule ^about$ /about-us [NC,L]
- 설명:
/About
,/ABOUT
,/about
등 대소문자 구분 없이about
으로 끝나는 URL을/about-us
로 리디렉션합니다. - 플래그:
NC
: 대소문자 구분 없음L
: 마지막 규칙 (아래 플래그에 대한 추가 설명 참조)
1.2 [L]
(Last)
- 의미: 현재 규칙이 적용된 후 더 이상의 규칙을 처리하지 않습니다. 즉, 리라이트 엔진을 종료합니다.
- 용도: 특정 조건이 만족되면 더 이상의 규칙을 무시하도록 설정할 때 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]
RewriteRule ^another-page$ /another-new-page [R=301,L]
- 설명:
^old-page$
패턴에 일치하면/new-page
로 리디렉션하고, 더 이상의 규칙을 적용하지 않습니다. 마찬가지로^another-page$
패턴에도 동일하게 적용됩니다.
1.3 [R]
또는 [R=code]
(Redirect)
- 의미: 클라이언트를 다른 URL로 리디렉션합니다. 기본값은
302
(임시 리디렉션)입니다.R=301
과 같이 상태 코드를 지정할 수 있습니다. - 용도: 클라이언트를 다른 위치로 이동시키고자 할 때 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^old-page$ /new-page [R=301,L]
- 설명:
/old-page
에 대한 요청을 영구적으로(301
)/new-page
로 리디렉션합니다.
1.4 [QSA]
(Query String Append)
- 의미: 기존의 쿼리 문자열을 새 리디렉션 URL에 추가합니다.
- 용도: 기존의 쿼리 파라미터를 유지하면서 리디렉션할 때 유용합니다.
예제:
RewriteEngine On
RewriteRule ^search$ /new-search [QSA,L]
- 설명:
/search?query=example
요청을/new-search?query=example
으로 리디렉션합니다.
1.5 [QSD]
(Query String Discard)
- 의미: 기존의 쿼리 문자열을 제거합니다.
- 용도: 쿼리 파라미터를 유지할 필요가 없을 때 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^search$ /new-search [QSD,L]
- 설명:
/search?query=example
요청을/new-search
로 리디렉션하며, 쿼리 문자열을 제거합니다.
1.6 [OR]
(OR Condition)
- 의미: 여러
RewriteCond
조건을 OR 논리로 연결할 때 사용됩니다. - 용도: 조건 중 하나만 만족해도 규칙을 적용하고자 할 때 유용합니다.
예제:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ http://www.new-example.com/$1 [R=301,L]
- 설명:
example.com
또는www.example.com
에 대한 요청을www.new-example.com
으로 리디렉션합니다.
1.7 [NE]
(No Escape)
- 의미: 리디렉션 URL의 특수 문자를 이스케이프 처리하지 않습니다.
- 용도: 리디렉션 URL에 특수 문자가 포함되어 있을 때 유용합니다.
예제:
RewriteEngine On
RewriteRule ^path$ /new path/with space [R=301,NE,L]
- 설명:
/path
요청을/new path/with space
로 리디렉션합니다.[NE]
를 사용하지 않으면 공백이%20
으로 인코딩됩니다.
1.8 [PT]
(Pass Through)
- 의미: 리라이트된 URL을 다시 Apache의 내부 핸들러로 전달합니다.
- 용도: 내부 핸들러나 다른 모듈과의 연동이 필요할 때 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^internal/(.*)$ /handler.php?file=$1 [PT,L]
- 설명:
/internal/file
요청을handler.php
로 전달하며, Apache의 내부 핸들러가 이를 처리하도록 합니다.
1.9 [F]
(Forbidden)
- 의미: 요청을 거부하고
403 Forbidden
상태 코드를 반환합니다. - 용도: 특정 URL에 대한 접근을 차단할 때 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^secret$ - [F,L]
- 설명:
/secret
에 대한 요청을 거부하고403 Forbidden
을 반환합니다.
1.10 [G]
(Gone)
- 의미: 요청된 리소스가 더 이상 존재하지 않음을 알리고
410 Gone
상태 코드를 반환합니다. - 용도: 리소스가 영구적으로 삭제되었음을 클라이언트에 알릴 때 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^old-resource$ - [G,L]
- 설명:
/old-resource
에 대한 요청에 대해410 Gone
을 반환합니다.
1.11 [B]
(Escape backreferences)
- 의미: 백참조(
$1
,$2
등)에 포함된 특수 문자를 이스케이프 처리합니다. - 용도: 리디렉션 URL에 사용자 입력이 포함될 때 보안을 강화하기 위해 사용됩니다.
예제:
RewriteEngine On
RewriteRule ^user/(.*)$ /profile.php?user=$1 [R=301,B,L]
- 설명:
/user/john
요청을/profile.php?user=john
으로 리디렉션하며,john
에 특수 문자가 포함되어 있을 경우 이를 이스케이프 처리합니다.
1.12 [C]
(Chain)
- 의미: 현재 규칙의 성공 여부에 따라 다음 규칙을 조건부로 적용합니다.
- 용도: 여러 규칙을 체인 형태로 연결하여 복잡한 조건을 구성할 때 사용됩니다.
예제:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/product
RewriteRule ^product/(.*)$ /item/$1 [C]
RewriteRule ^item/(.*)$ /new-item/$1 [R=301,L]
- 설명:
/product/item
요청이/item/item
으로 리라이트되고, 이어서/new-item/item
으로 리디렉션됩니다.
2. RewriteCond 플래그
RewriteCond
지시어는 RewriteRule
의 조건을 정의하는 데 사용되며, 각 조건에도 플래그를 추가할 수 있습니다. 주요 플래그는 다음과 같습니다.
2.1 [NC]
(No Case)
- 의미: 조건 패턴을 대소문자 구분 없이 매칭합니다.
- 용도: 호스트 이름이나 다른 조건에서 대소문자를 무시하고 매칭할 때 사용됩니다.
예제:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ /newpage [L]
- 설명:
www.example.com
,WWW.EXAMPLE.COM
등 대소문자 구분 없이 매칭됩니다.
2.2 [OR]
(OR Condition)
- 의미: 여러
RewriteCond
조건을 OR 논리로 연결합니다. - 용도: 조건 중 하나만 만족해도 규칙을 적용하고자 할 때 유용합니다.
예제:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/old-page$ [OR]
RewriteCond %{REQUEST_URI} ^/legacy-page$
RewriteRule ^(.*)$ /new-page [R=301,L]
- 설명:
/old-page
또는/legacy-page
에 대한 요청을/new-page
로 리디렉션합니다.
2.3 [NC,OR]
등 복합 플래그
- 의미: 여러 플래그를 동시에 적용할 수 있습니다.
- 용도: 여러 조건을 결합할 때 유용합니다.
예제:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ http://www.new-example.com/$1 [R=301,L]
- 설명:
example.com
또는www.example.com
에 대한 요청을www.new-example.com
으로 리디렉션하며, 호스트 이름의 대소문자를 구분하지 않습니다.
2.4 [R=code]
(Redirect with Status Code)
- 의미: 조건이 만족될 때 특정 상태 코드로 리디렉션합니다.
- 용도: 조건에 따라 다양한 상태 코드로 응답을 제어할 때 사용됩니다.
예제:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
- 설명: HTTPS가 사용되지 않은 요청을 HTTPS로 리디렉션하며,
301
상태 코드를 반환합니다.
2.5 [OR]
와 [NC]
조합
- 의미: 조건을 대소문자 구분 없이 매칭하고, OR 논리를 적용합니다.
- 용도: 여러 호스트 이름을 대소문자 구분 없이 매칭할 때 사용됩니다.
예제:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^test\.example\.com$ [NC]
RewriteRule ^(.*)$ /new-location [R=301,L]
- 설명:
example.com
또는test.example.com
에 대한 요청을/new-location
으로 리디렉션하며, 호스트 이름의 대소문자를 구분하지 않습니다.
3. 자주 사용되는 플래그들의 조합 예제
3.1 영구 리디렉션과 대소문자 무시
목표: OLD-DOMAIN.com
또는 old-domain.com
으로 오는 모든 요청을 https://new-domain.com
으로 영구 리디렉션합니다.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?old-domain\.com$ [NC]
RewriteRule ^(.*)$ https://new-domain.com/$1 [R=301,L]
- 설명:
RewriteCond
: 호스트가old-domain.com
또는www.old-domain.com
일 경우를 대소문자 구분 없이 매칭합니다.RewriteRule
: 모든 요청 경로를https://new-domain.com/
으로 영구 리디렉션합니다.- 플래그:
NC
: 대소문자 구분 없음R=301
: 영구 리디렉션L
: 마지막 규칙
3.2 특정 디렉토리의 요청을 다른 서버로 프록시
목표: /api
로 시작하는 모든 요청을 내부적으로 다른 서버(http://backend-server.com
)로 프록시합니다.
RewriteEngine On
RewriteRule ^api/(.*)$ http://backend-server.com/api/$1 [P,L]
- 설명:
RewriteRule
:/api/
로 시작하는 요청을http://backend-server.com/api/
로 프록시합니다.- 플래그:
P
: 프록시 처리L
: 마지막 규칙
3.3 쿼리 문자열 유지하며 리디렉션
목표: /search
로 오는 요청을 /new-search
로 리디렉션하면서 쿼리 문자열을 유지합니다.
RewriteEngine On
RewriteRule ^search$ /new-search [R=301,QSA,L]
- 설명:
RewriteRule
:/search
요청을/new-search
로 영구 리디렉션합니다.- 플래그:
R=301
: 영구 리디렉션QSA
: 기존 쿼리 문자열을 유지L
: 마지막 규칙
4. 플래그의 전체 목록과 설명
아래는 mod_rewrite
에서 사용 가능한 주요 플래그들의 전체 목록과 간단한 설명입니다.
플래그 | 의미 | 설명 |
---|---|---|
NC |
No Case | 대소문자 구분 없이 매칭 |
L |
Last | 마지막 규칙으로 처리 |
R |
Redirect | 리디렉션을 수행 (기본적으로 302) |
R=code |
Redirect with Status Code | 지정한 상태 코드로 리디렉션 (예: R=301 ) |
QSA |
Query String Append | 기존 쿼리 문자열을 추가 |
QSD |
Query String Discard | 기존 쿼리 문자열을 제거 |
OR |
OR Condition | 다음 조건과 OR 논리로 연결 |
NE |
No Escape | 특수 문자를 이스케이프하지 않음 |
PT |
Pass Through | 내부 핸들러로 전달 |
F |
Forbidden | 403 Forbidden 반환 |
G |
Gone | 410 Gone 반환 |
B |
Escape Backreferences | 백참조의 특수 문자를 이스케이프 |
C |
Chain | 규칙을 체인으로 연결 |
N |
Next | 다음 규칙을 다시 처리 |
NS |
No Subrequest | 서브 요청에서 규칙을 적용하지 않음 |
CO |
Cookie | 쿠키 설정 |
S |
Skip | 다음 N개의 규칙을 건너뜀 |
참고: 모든 플래그를 이 자리에서 상세히 설명하기는 어렵지만, 주요 플래그에 대해 집중적으로 설명드렸습니다. 추가적으로 필요한 플래그는 Apache 공식 문서를 참고하시기 바랍니다.
5. 플래그 사용 시 주의사항
- 플래그 순서: 대부분의 플래그는 순서에 영향을 받지 않지만, 일부 플래그는 특정 순서로 사용하는 것이 권장됩니다. 예를 들어,
R=301
과L
을 함께 사용할 때는[R=301,L]
순서로 작성하는 것이 일반적입니다. - 플래그 조합: 여러 플래그를 동시에 사용할 때는 쉼표로 구분하며, 각 플래그의 역할을 명확히 이해한 후 조합해야 예기치 않은 동작을 방지할 수 있습니다.
- 보안 고려사항:
[B]
플래그 등을 사용할 때는 사용자 입력을 안전하게 처리하여 보안 취약점을 방지해야 합니다.
6. 추가 예제
6.1 HTTPS로 강제 리디렉션
목표: 모든 HTTP 요청을 HTTPS로 리디렉션합니다.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
- 설명:
RewriteCond
: HTTPS가 사용되지 않은 경우RewriteRule
: 동일한 호스트와 요청 URI로 HTTPS를 사용하여 리디렉션- 플래그:
R=301
: 영구 리디렉션L
: 마지막 규칙
6.2 특정 파일 확장자 리디렉션
목표: .php
파일 요청을 .html
파일로 리디렉션합니다.
RewriteEngine On
RewriteRule ^(.*)\.php$ /$1.html [R=301,L]
- 설명:
RewriteRule
:.php
로 끝나는 모든 요청을.html
로 변경하여 리디렉션- 플래그:
R=301
: 영구 리디렉션L
: 마지막 규칙
6.3 사용자 에이전트에 따른 리디렉션
목표: 모바일 사용자에게는 모바일 사이트로, 데스크탑 사용자에게는 데스크탑 사이트로 리디렉션합니다.
RewriteEngine On
# 모바일 사용자 에이전트 감지
RewriteCond %{HTTP_USER_AGENT} "iphone|android" [NC]
RewriteRule ^(.*)$ https://m.example.com/$1 [R=302,L]
- 설명:
RewriteCond
: 사용자 에이전트가iphone
또는android
를 포함하는 경우RewriteRule
: 모바일 사이트로 임시 리디렉션- 플래그:
NC
: 대소문자 구분 없음R=302
: 임시 리디렉션L
: 마지막 규칙
7. 결론
Apache의 mod_rewrite
모듈에서 사용되는 플래그들은 URL 재작성 및 리디렉션을 세밀하게 제어할 수 있는 중요한 도구입니다. 각 플래그의 기능과 사용법을 정확히 이해하고 적절히 조합하여 원하는 동작을 구현할 수 있습니다. 위에서 설명한 주요 플래그들과 예제들을 참고하여, 다양한 시나리오에 맞는 URL 재작성 규칙을 효과적으로 설정하시기 바랍니다.
추가적으로, 복잡한 리라이트 규칙을 작성할 때는 테스트 환경에서 충분히 테스트한 후, 실제 서버에 적용하는 것이 중요합니다. 이를 통해 예기치 않은 동작이나 보안 취약점을 사전에 방지할 수 있습니다.
도움이 되셨기를 바랍니다!
댓글남기기