.htaccess 생성기

Apache .htaccess 설정을 온라인에서 즉시 생성하세요. HTTPS 강제 리디렉션, 브라우저 캐싱, 디렉터리 목록 차단, 커스텀 리디렉션 지원. 가입 불필요.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
.htaccess
 

설정 항목을 선택하면 설정을 미리 볼 수 있습니다.

자세한 가이드 읽기 .htaccess 생성기: mod_rewrite 없이 Apache 설정 파일 만들기
예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

생성기가 출력하는 규칙

  • HTTPS 강제: %{HTTPS}가 off일 때 같은 호스트의 https:// 주소로 301 리디렉션하는 RewriteRule입니다. mod_rewrite가 필요하며, <IfModule mod_rewrite.c>로 감싸 두었기 때문에 모듈이 없는 서버에서는 오류 없이 무시됩니다.
  • WWW 리다이렉트: 주소를 www가 붙은 형태나 뺀 형태 하나로 통일합니다. HTTPS 강제를 꺼 두어도 이동할 주소는 항상 https://입니다.
  • 디렉토리 인덱스: 디렉터리 주소로 요청이 왔을 때 Apache가 차례로 찾는 파일입니다. 기본값은 index.php index.html index.htm이고, 입력란이 비어 있거나 공백뿐이면 index.php index.html로 출력됩니다. 파일 이름 사이의 전각 공백은 반각 공백으로 바꿔 씁니다. Apache는 반각 공백으로만 이름을 나누기 때문입니다.
  • 브라우저 캐싱: mod_expires로 이미지, CSS/JavaScript, 글꼴에 Expires와 Cache-Control: max-age를 붙입니다. MIME 유형마다 ExpiresByType을 한 줄씩 쓰므로, 목록에 없는 유형으로 응답되는 파일에는 헤더가 붙지 않습니다.
  • 보안: 디렉터리 목록을 끄고(Options -Indexes), .htaccess와 .env에 대한 직접 접근을 Require all denied로 막습니다. 보안 헤더(X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN, Referrer-Policy: strict-origin-when-cross-origin, X-XSS-Protection: 0)는 기본으로 꺼져 있습니다. X-XSS-Protection을 0으로 두는 것은 OWASP HTTP Headers Cheat Sheet의 권장값입니다.
  • 사용자 정의 리다이렉트: 원본 경로와 대상 URL을 모두 입력하면 Redirect 지시문 한 줄을 만듭니다. 상태는 301 또는 302 중에서 고릅니다.

예: 기본 설정 그대로의 출력

페이지를 연 직후의 설정(HTTPS 강제, 디렉토리 인덱스, 브라우저 캐싱, 보안의 앞 세 항목)으로는 다음 파일이 나옵니다.

# Force HTTPS
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} off
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

# Directory Index
DirectoryIndex index.php index.html index.htm

# Browser Caching
<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresByType image/jpeg "access plus 1 year"
  ExpiresByType image/png "access plus 1 year"
  ExpiresByType image/gif "access plus 1 year"
  ExpiresByType image/svg+xml "access plus 1 year"
  ExpiresByType image/webp "access plus 1 year"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType font/woff "access plus 1 year"
  ExpiresByType font/woff2 "access plus 1 year"
  ExpiresByType font/ttf "access plus 1 year"
  ExpiresByType application/x-font-ttf "access plus 1 year"
  ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
</IfModule>

# Security
Options -Indexes
<Files ".htaccess">
  Require all denied
</Files>
<Files ".env">
  Require all denied
</Files>

Apache 2.4.67에서 AllowOverride All인 디렉터리에 두고 HTTP로 요청하면 /는 301, /.env와 /.htaccess는 403이었습니다. 글꼴에 font/ttf와 application/x-font-ttf가 함께 있는 까닭은 Apache 2.4에 들어 있는 mime.types가 .ttf를 font/ttf로 보내고, 오래된 설정은 x-가 붙은 이름을 쓰기 때문입니다.

예: 카페24 웹호스팅의 기존 .htaccess에 덧붙일 때

카페24 웹호스팅은 FTP의 /www 폴더가 홈페이지 최상위 폴더이고, 기본 메인 페이지 경로를 /www/index.html 또는 /www/index.php로 안내합니다(홈페이지 접속 오류 FAQ). 같은 FAQ는 PHP 메모리 한도 같은 설정도 /www/.htaccess에 넣도록 안내하므로, 이미 파일이 있다면 내용을 덮어쓰지 말고 아래에 덧붙입니다. 파일 이름은 정확히 .htaccess여야 하며 .htaccess.txt로 저장하면 적용되지 않습니다(무단 링크 방지 FAQ).

예를 들어 .env 파일을 실수로 올렸을 때를 대비하는 규칙만 덧붙이려면, 기본으로 켜져 있는 “HTTPS 강제”, “디렉토리 인덱스”, “브라우저 캐싱”을 끄고, 옵션의 보안 항목에서 “.htaccess 파일 숨기기”를 해제해 “디렉토리 탐색 비활성화”와 “.env 파일 숨기기”만 남깁니다. 출력은 다음과 같습니다.

# Security
Options -Indexes
<Files ".env">
  Require all denied
</Files>

주의할 점은 기존 파일의 문법입니다. 카페24의 무단 링크 방지 FAQ 예시는 Apache 2.2 문법인 Order, Allow from, Deny from을 씁니다. 그 예시의 일부(검색엔진 줄 생략) 아래에 위 출력을 붙인 파일로 Apache 2.4.67에서 확인했습니다.

SetEnvIf Referer mydomain.com go_in
SetEnvIf Referer ^$ go_in

Order Deny,Allow
Allow from env=go_in
Deny from all

# Security
Options -Indexes
<Files ".env">
  Require all denied
</Files>

mod_access_compat을 불러온 서버에서는 Referer 없는 / 요청이 200, /.env는 403이었습니다. 이 모듈이 없으면 Order 줄 때문에 사이트 전체가 500이 되고, 오류 로그에 Invalid command ‘Order’가 남습니다. 또 Apache 2.4 업그레이드 문서는 옛 지시문과 Require를 섞는 것이 기술적으로는 가능하지만 권장하지 않는다고 적고 있습니다. 새로 쓰는 규칙은 Require로 통일하고, 기존 Order 줄도 같은 뜻의 Require로 바꿔 두는 편이 안전합니다.

제한과 자주 나는 오류

  • 500 Internal Server Error: 모든 지시문은 해당 디렉터리의 AllowOverride가 허용해야 합니다. AllowOverride FileInfo 환경에서는 Options -Indexes 한 줄만으로 디렉터리 전체가 500이 되었습니다.
  • 모든 페이지가 403: .htaccess의 RewriteRule에는 Options FollowSymLinks나 SymLinksIfOwnerMatch가 필요합니다. 둘 다 꺼져 있으면 규칙에 닿는 요청이 모두 거부됩니다(오류 로그 AH00670).
  • CDN이나 로드 밸런서 뒤에서 리디렉션이 끝나지 않음: %{HTTPS}는 Apache가 직접 받은 연결을 뜻합니다. 앞단 프록시가 TLS를 끝내고 Apache에는 HTTP로 넘기면 값이 항상 off여서 HTTPS 강제가 반복됩니다. 이때는 프록시에서 HTTPS로 보내거나 프록시가 붙이는 헤더를 조건으로 쓰세요.
  • www 강제는 서브도메인에도 적용: www.로 시작하지 않는 모든 호스트에 www.를 붙이므로 blog.example.co.kr은 www.blog.example.co.kr로, IP 주소에도 붙습니다.
  • 이름이 정확히 같은 파일만 보호: .env 블록은 .env.local이나 .env.production을 막지 않습니다. 이런 파일은 웹 루트 밖에 두세요.
  • 원본 경로는 슬래시로 시작: Redirect 문서에 따르면 원본 경로는 슬래시로 시작하는 경로이며 상대 경로는 쓸 수 없습니다. Redirect 301 old-page …는 Apache 2.4.67에서 오류 없이 읽혔지만 /old-page 요청은 리디렉션되지 않았습니다. 그래서 원본 경로가 /로 시작하지 않으면 생성기는 이 줄을 출력하지 않고, 복사 버튼 아래 상태 줄에 오류를 표시합니다. 다른 규칙은 그대로 복사할 수 있습니다.
  • 경로 중간에 공백 금지: 원본 경로나 대상 URL 중간에 공백이 있으면 Redirect 줄의 인수가 4개가 되고, Apache 2.4.67에서는 디렉터리 전체가 500이 되었습니다(오류 로그 “Redirect takes one, two or three arguments”). 생성기는 오류를 표시하고 이 줄을 출력하지 않습니다. 대상 URL의 공백은 %20으로 쓰고, 공백이 든 원본 경로는 파일을 직접 고쳐 경로를 따옴표로 감싸세요(Redirect 301 “/old page” …는 같은 확인에서 리디렉션되었습니다).
  • “사용자 정의 리다이렉트”는 한 줄만 만듭니다. 여러 개가 필요하면 Redirect 줄을 복사해 고치세요. Basic 인증, CORS, gzip / Brotli 압축 항목은 없습니다. 비밀번호 파일은 htpasswd 생성기로 만들 수 있습니다.

FAQ

.htaccess 파일이란 무엇인가요?

Apache 웹 서버가 디렉터리마다 읽는 설정 파일입니다. 메인 설정 파일을 고치지 않고도 해당 디렉터리의 URL 리디렉션, 캐시 규칙, 접근 제어, 보안 헤더를 정할 수 있습니다. 다만 Apache는 그 디렉터리의 AllowOverride가 허용한 지시문만 실행합니다.

Nginx나 다른 서버에서도 사용할 수 있나요?

.htaccess는 Apache의 형식입니다(LiteSpeed도 읽습니다). Nginx는 설정 문법이 다르고 .htaccess 파일을 읽지 않습니다. Nginx 서버라면 같은 내용을 nginx.conf 지시문으로 옮겨 써야 합니다.

파일을 올렸더니 사이트가 500 Internal Server Error를 냅니다.

해당 디렉터리의 AllowOverride가 허용하지 않는 지시문이 .htaccess에 있으면 Apache는 500을 돌려줍니다. 예를 들어 AllowOverride에 Options가 없는데 Options -Indexes를 쓰면 오류 로그에 "Options not allowed here"가 남습니다. 그 줄을 지우거나 호스팅 업체에 허용을 요청하세요.

.htaccess 자체에 대한 접근을 막아도 괜찮나요?

괜찮습니다. 서버에서 이미 막고 있어도 충돌하지 않습니다. Apache 2.4에 들어 있는 httpd.conf에는 원래 <Files ".ht*">와 Require all denied 설정이 있습니다. 생성되는 블록도 같은 Apache 2.4 지시문 Require(mod_authz_core)를 씁니다. Apache 2.2의 Order / Deny 문법은 2.4에서 mod_access_compat을 불러왔을 때만 동작합니다.

301 리디렉션과 302 리디렉션의 차이는 무엇인가요?

301은 영구 이동으로, 브라우저와 검색엔진이 기억해 두고 링크를 새 주소로 바꿉니다. 302는 임시 이동으로, 클라이언트가 매번 원래 주소를 다시 확인합니다. 도메인 이전이나 대표 URL 정리에는 301을, 일시적으로 옮길 때는 302를 쓰세요.

입력한 설정이 어딘가로 전송되거나 저장되나요?

아닙니다. 파일은 브라우저 페이지 안에서 고른 설정으로 만들어집니다. 설정은 서버로 보내지지 않고 브라우저 저장소에도 남지 않으므로, 페이지를 새로 고치면 기본값으로 돌아갑니다. 복사를 누를 때 사이트 통계가 기록하는 것은 도구 이름과 동작뿐이며, 경로나 URL, 파일 내용은 기록하지 않습니다.