Last Updated on 2026/07/22 by Tomylove
🔄 콘텐츠 업데이트 히스토리 (History)
- 최초 작성일: 2014년 4월 29일
- 개정 사항: 아파치(Apache) mod_rewrite의 속성자 및 플래그(Flags) 직역 오류 정정, [L]과 [END]의 내부 루프 재처리 동작 차이 명확화, 2026년 기준 워드프레스 고유주소(Permalink) 모범 사례 및 SEO 301 리다이렉트 실무 코드 추가
워드프레스(WordPress) 사이트를 운영하거나 SEO(검색엔진 최적화) 작업을 진행할 때 가장 자주 다루게 되는 핵심 설정 파일이 바로 .htaccess입니다.
웹 서버가 요청을 받아 처리할 때 주소를 재작성하거나 원하는 곳으로 보낼 수 있는 강력한 무기이지만, 아파치(Apache)의 mod_rewrite 모듈 문법을 정확히 이해하지 못하면 뜻하지 않은 무한 루프(Loop)나 500 Internal Server Error를 겪기 쉽습니다.
본 문서에서는 워드프레스에서 활용되는 RewriteCond의 파일·디렉터리 속성자(Attributes)부터 RewriteRule에서 사용되는 필수 플래그(Flags)의 정확한 개념과 실무 적용 사례를 정리합니다.

1. RewriteCond 조건문: 파일 및 디렉터리 속성자
RewriteCond 구문 뒤에 작성하는 속성자는 요청된 URL 경로가 웹 서버 상의 실체 파일이나 디렉터리인지 검사할 때 사용됩니다. 워드프레스 기본 고유주소 규칙의 핵심이 되는 조건식입니다.
| 속성자 | 설명 | 영어 원문 및 의미 |
|---|---|---|
| -f | 테스트 경로가 존재하며, 정규 파일(Regular File)인지 검사합니다. | Treats the TestString as a pathname and tests whether it is a regular file. |
| -d | 테스트 경로가 존재하며, 디렉터리(Directory)인지 검사합니다. | Treats the TestString as a pathname and tests whether it is a directory. |
| -l / -L / -h | 테스트 경로가 심볼릭 링크(Symbolic Link)인지 검사합니다. | Tests whether it is a symbolic link. May also use Bash convention (-L, -h). |
💡 부정 연산자 ‘!’의 활용:
모든 속성자 앞에는 느낌표(!)를 붙여 조건식을 반대로 뒤집을 수 있습니다.
예를 들어RewriteCond %{REQUEST_FILENAME} !-f는 “요청된 파일이 실제 존재하는 파일이 아닐 때”를 의미합니다.

2. RewriteRule 주요 플래그(Flags) 상세 분석
RewriteRule 구문 마지막 대괄호 안에 작성하는 플래그 [FLAG]는 치환(Rewrite)된 주소를 아파치 서버가 어떻게 다룰지 지정하는 제어 명령입니다.
- [L] | last: 현재 규칙이 일치하면 규칙 평가를 즉시 중단합니다. 단, .htaccess와 같은 디렉터리 단위 컨텍스트에서는 내부 재요청(Internal Sub-request)이 발생하여 .htaccess 첫 줄부터 다시 실행될 수 있습니다.
- [END]: 아파치 2.3.9 이상에서 지원하며, 재작성 과정을 즉시 완전히 종료합니다. [L]과 달리 .htaccess 내부 재처리 루프 자체를 방지하므로 무한 루프 예방에 효과적입니다.
- [NC] | nocase: 패턴 비교 시 대소문자를 구분하지 않습니다. (Case-Insensitive)
- [QSA] | qsappend: 원래 요청에 포함되어 있던 쿼리 스트링(Query String, 예:
?page=2)을 치환될 URL의 쿼리 뒤에 결합(Append)하여 보존합니다. - [QSD] | qsdiscard: 원래 요청의 쿼리 스트링을 모두 버립니다.
- [R=code] | redirect: 클라이언트 브라우저에 외부 리다이렉트를 전달합니다. 기본값은 302(임시 이동)이며, SEO 목적일 경우
[R=301,L]과 같이 301(영구 이동)을 명시해야 주소 변경에 따른 SEO 평가 점수가 보존됩니다. - [F] | forbidden: 403 Forbidden 응답을 반환하고 처리를 중단합니다. 보안 규칙 작성 시 유용합니다.
- [G] | gone: 410 Gone 응답을 반환합니다. 삭제된 페이지임을 명확히 알릴 때 쓰입니다.
- [C] | chain: 다음 규칙과 체인(연결)시킵니다. 현재 규칙이 실패하면 연결된 다음 규칙도 실행되지 않고 건너뜁니다.
- [CO=NAME:VAL:domain:lifetime:path:secure:httponly] | cookie: 응답 시 브라우저에 쿠키를 설정합니다.
- [NE] | noescape: 치환 결과에서 특수문자를 16진수로 이스케이프(Hex-code escaping) 처리하지 못하도록 막습니다.
- [P] | proxy: 대체 URL을 프록시(Proxy) 요청으로 보냅니다. mod_proxy 모듈이 필요합니다.
3. 실제 적용 실무 예시: 워드프레스 기본 구조 해설
이 개념들이 실제로 워드프레스 사이트의 .htaccess에서 어떻게 조합되는지 살펴보면 다음과 같습니다.
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
위 기본 규칙의 작동 방식을 해석하면 아래와 같습니다.
- 요청 파일이
index.php면 추가 작업 없이 처리를 종료합니다. ([L]) - 요청된 경로가 실제 존재하는 파일이 아니고(
!-f), 디렉터리도 아니라면(!-d), - 모든 요청을 워드프레스 메인 컨트롤러인
/index.php로 보냅니다. ([L])
4. 자주 활용되는 고급 SEO 리다이렉트 패턴
사이트 도메인을 변경하거나 HTTP에서 HTTPS로 보안 접속을 강제할 때 쓰는 표준 문법입니다.
HTTPS 접속 강제 설정 (301 Redirect)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
www가 없는 도메인으로 통일 (Non-WWW)
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

자주 묻는 질문 (FAQ)
Q1. [L] 플래그를 붙였는데도 규칙이 계속 실행되는 느낌입니다. 이유가 무엇인가요?
A. .htaccess 파일 환경에서는 [L] 플래그를 만나 평가가 중단되더라도, URL이 변경된 후 아파치가 이를 새로운 요청으로 간주하여 .htaccess를 처음부터 다시 읽는 내부 재요청(Internal Sub-request)을 발생시킬 수 있습니다. 이를 완벽히 방지하고 싶다면 아파치 2.3.9 이상에서 제공하는 [END] 플래그를 사용하는 것이 해결책이 될 수 있습니다.
Q2. URL 뒤에 파라미터(?page=1)가 붙어오는데 보존하려면 어떻게 하나요?
A. 규칙 끝의 플래그에 [QSA] (Query String Append)를 추가해야 합니다. 예: [R=301,L,QSA]
참고 공식 문서 (Official Reference):
Apache HTTP Server Version 2.4 – Module mod_rewrite Documentation
워드프레스 최적화 관련 추천 글