Apache의 mod_rewrite 모듈은 강력하고 유연한 URL 재작성 기능을 제공하며, 이를 통해 다양한 URL 리디렉션 및 변환 작업을 수행할 수 있습니다. RewriteRuleRewriteCond 지시어는 이 모듈의 핵심 구성 요소로, 각 지시어의 끝에 붙는 대괄호([]) 안의 플래그(flags)는 규칙의 동작 방식을 제어하는 역할을 합니다.

이번 답변에서는 RewriteEngine에서 RewriteCondRewriteRule에 사용되는 주요 플래그들의 종류와 그 의미를 예제와 함께 상세히 설명하겠습니다.

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=301L을 함께 사용할 때는 [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 재작성 규칙을 효과적으로 설정하시기 바랍니다.

추가적으로, 복잡한 리라이트 규칙을 작성할 때는 테스트 환경에서 충분히 테스트한 후, 실제 서버에 적용하는 것이 중요합니다. 이를 통해 예기치 않은 동작이나 보안 취약점을 사전에 방지할 수 있습니다.

도움이 되셨기를 바랍니다!

댓글남기기