[WP] 워드프레스 htaccess 기본 설정 및 WWW URL 제거 방법

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정
워드프레스 htaccess 규칙과 www 리디렉션 확인

워드프레스 htaccess 기본 설정은 고유주소가 작동하도록 Apache가 요청을 index.php로 넘기게 하는 몇 줄의 규칙입니다. 워드프레스 7.1이 직접 기록한 .htaccess를 공식 문서 규칙과 대조하고, Nginx + Apache 구성 서버에서 www 주소가 https 기본 주소로 301 리디렉션되는 응답을 curl로 확인했습니다.

.htaccess는 Apache가 폴더마다 읽는 설정 파일이라 서버 종류에 따라 적용 여부가 달라지며, Nginx만 사용하는 서버에서는 같은 동작을 server 블록에 넣게 됩니다.

1️⃣ 워드프레스 htaccess 기본 설정

  • ↪️ 일반 사이트 규칙

워드프레스 공식 문서는 파일이 손상되었을 때 아래 일반 사이트 규칙으로 되살리도록 안내합니다.

# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

워드프레스 7.1이 기록한 파일에서 워드프레스 칸만 꺼내 보면 같은 규칙이 [<IfModule mod_rewrite.c>] 안에 들어 있습니다.

sed -n '/<IfModule/,/<\/IfModule>/p' .htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

[<IfModule mod_rewrite.c>]는 mod_rewrite 모듈이 없는 서버에서 이 칸을 건너뛰게 하는 조건이며, 모듈이 있는 서버에서는 공식 문서 규칙과 똑같이 동작합니다. 줄마다 하는 일은 아래와 같습니다.

줄하는 일
RewriteEngine On이 파일의 재작성 규칙 사용
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]Authorization 헤더를 PHP로 전달(애플리케이션 비밀번호 같은 REST API 인증에서 사용)
RewriteBase /규칙의 기준 경로를 웹 루트로 지정
RewriteRule ^index\.php$ - [L]index.php 요청은 그대로 두고 처리 종료
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
실제 파일과 폴더 요청은 다음 줄에서 제외
RewriteRule . /index.php [L]나머지 요청을 index.php로 넘겨 워드프레스가 주소 해석

[# BEGIN WordPress]와 [# END WordPress] 사이는 워드프레스가 고유주소를 저장할 때마다 다시 기록하는 자리입니다. 직접 넣은 규칙이 이 안에 있으면 저장 한 번에 지워지므로, 리디렉션 같은 규칙은 이 두 줄 바깥 위쪽에 따로 둡니다.

[설정 › 고유주소]에서 [글 이름] 같은 구조를 고르고 [변경 사항 저장]을 누르면, 워드프레스가 .htaccess의 워드프레스 칸을 지금 구조에 맞춰 다시 기록합니다.

고유주소 설정 화면: 워드프레스 htaccess 기본 설정을 다시 기록하는 고유주소 구조의 글 이름 선택과 변경 사항 저장 버튼, 왼쪽 설정 메뉴

웹 서버 계정이 .htaccess에 쓸 권한이 없으면 같은 화면 아래에 넣을 규칙이 나오며, 그 내용을 파일에 직접 붙여 넣게 됩니다.

2️⃣ 워드프레스 htaccess 멀티사이트 규칙

멀티사이트는 하위 사이트 주소를 만드는 방식에 따라 규칙이 다르며, 워드프레스 3.5 이후에 멀티사이트를 켰다면 아래 두 규칙 가운데 하나를 사용합니다.

🔲 하위 디렉터리 규칙

example.com/site1처럼 경로로 하위 사이트를 나누는 방식입니다. 규칙 앞쪽의 ([_0-9a-zA-Z-]+/)? 부분이 주소 앞의 사이트 경로를 떼어 내고 wp-admin, wp-content 경로를 찾습니다.

# BEGIN WordPress Multisite
# Using subfolder network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

# END WordPress Multisite

[# add a trailing slash to /wp-admin] 아래 줄은 example.com/site1/wp-admin처럼 끝에 슬래시 없이 들어온 관리자 주소에 슬래시를 붙여 301로 보냅니다.

🔲 하위 도메인 규칙

site1.example.com처럼 하위 도메인으로 나누는 방식이라 떼어 낼 경로가 없습니다. 하위 도메인을 서버로 보내는 DNS와 서버 설정이 먼저 필요합니다.

# BEGIN WordPress Multisite
# Using subdomain network type: https://wordpress.org/documentation/article/htaccess/#multisite

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]

# END WordPress Multisite

두 방식의 차이와 네트워크 설치 순서는 워드프레스 멀티사이트 글에서 실측 화면으로 확인할 수 있습니다. 3.4 이하에서 멀티사이트를 켠 오래된 설치는 업로드 파일 줄이 더 있는 공식 문서의 옛 규칙을 사용합니다.

3️⃣ 워드프레스 htaccess 적용 서버

  • ↪️ Apache와 Nginx, LiteSpeed 차이

규칙을 제대로 넣어도 서버가 .htaccess를 읽지 않으면 글 주소에서 404 오류가 납니다. 서버 구성마다 이 파일을 읽는지와 규칙을 넣는 자리는 아래와 같습니다.

서버 구성.htaccess규칙을 넣는 자리
Apache 2.4AllowOverride 값에 따라 읽음.htaccess 또는 VirtualHost 설정
앞단 Nginx + 뒤 Apache페이지 요청은 뒤의 Apache가 읽음페이지는 .htaccess, 정적 파일과 리디렉션은 앞단 Nginx 설정
Nginx 단독읽지 않음server 블록
LiteSpeed Web Server읽음.htaccess

🔲 Apache AllowOverride와 mod_rewrite

Apache 2.4의 [AllowOverride] 기본값은 None이며, None이면 Apache가 .htaccess 파일을 아예 읽지 않습니다. 워드프레스 규칙의 [RewriteEngine]은 FileInfo 권한에 속하므로, 웹 루트 디렉터리 설정에 All이나 FileInfo가 들어 있어야 합니다.

<Directory /var/www/html>
    AllowOverride All
</Directory>

mod_rewrite 모듈이 켜져 있는지는 Apache 모듈 목록에서 확인합니다.

httpd -M | grep rewrite
 rewrite_module (shared)

Debian 계열은 [apache2ctl -M]으로 같은 목록을 확인하고, 목록에 없으면 [a2enmod rewrite]로 활성화합니다. 메인 설정 파일을 수정할 수 있다면 Apache 공식 문서는 규칙을 .htaccess보다 메인 설정에 두도록 권합니다. 메인 설정은 서버를 시작할 때 한 번만 읽지만, .htaccess는 요청마다 다시 읽기 때문입니다.

🔲 Nginx server 블록 규칙

Nginx에는 Apache의 .htaccess 같은 폴더별 설정 파일이 없어 워드프레스가 규칙을 기록할 수 없으며, 고유주소는 server 블록의 [location /]에 아래 한 줄을 넣어 같은 동작을 만듭니다.

location / {
    try_files $uri $uri/ /index.php?$args;
}

[try_files]는 요청한 이름의 파일과 폴더를 차례로 찾고 없으면 index.php로 넘기므로, Apache 규칙의 [!-f]와 [!-d] 두 줄과 같은 일을 합니다. 수정한 뒤에는 문법 검사를 거쳐 설정을 다시 불러옵니다.

nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
systemctl reload nginx

[reload]는 Nginx를 멈추지 않고 새 설정을 불러오므로, 처리 중인 요청이 끊기지 않습니다.

🔲 Nginx + Apache와 LiteSpeed

앞단 Nginx가 요청을 받아 뒤의 Apache로 넘기는 구성에서는 Apache가 .htaccess를 읽으므로 워드프레스 규칙도 그대로 동작합니다. 워드프레스 공식 문서도 응답 헤더에 Nginx가 보이는 사이트 대부분이 이런 구성이라고 설명합니다.

이미지, CSS 같은 정적 파일을 앞단 Nginx가 직접 처리하는 설정에서는 그 요청이 Apache까지 가지 않아 .htaccess 규칙이 적용되지 않습니다.

LiteSpeed Web Server는 공식 문서에서 Apache 설정 파일과 .htaccess를 그대로 읽는다고 안내하므로, 같은 규칙을 사용합니다.

4️⃣ 워드프레스 WWW URL 제거

  • ↪️ non-www 301 리디렉션

www가 붙은 주소와 붙지 않은 주소가 둘 다 열리면 검색엔진은 같은 글을 서로 다른 두 주소로 보게 되므로, 한쪽을 기본 주소로 정하고 다른 쪽은 301로 보냅니다.

🔲 htaccess www 제거 규칙

https 이동과 www 제거를 한 번에 처리하는 규칙은 [# BEGIN WordPress] 위에 따로 둡니다.

# BEGIN Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
</IfModule>
# END Redirect

http로 들어오거나 www가 붙은 요청이면 https://example.com/ 뒤에 원래 경로를 붙여 301로 보냅니다. .htaccess에서는 경로가 앞의 슬래시 없이 [$1]에 담기므로 주소와 [$1] 사이의 슬래시를 빼지 않습니다.

이 규칙을 [# BEGIN WordPress] 안에 넣으면 고유주소를 저장할 때 지워지고, 워드프레스 칸 아래에 두면 그 칸 마지막 줄 [RewriteRule . /index.php]에서 처리가 끝나 글 주소 요청에는 닿지 않습니다.

앞단 Nginx가 https를 받고 뒤의 Apache에는 http로 넘기는 구성에서는 Apache가 보는 [%{HTTPS}] 값이 늘 off라 이 규칙이 리디렉션을 끝없이 되풀이합니다. 이때는 리디렉션을 앞단 Nginx에서 처리하거나, 조건을 앞단이 보내는 [X-Forwarded-Proto] 헤더로 확인합니다.

🔲 VirtualHost 설정

Apache 공식 문서는 정식 호스트 이름으로 보내는 일에 mod_rewrite보다 VirtualHost 안의 [Redirect]를 먼저 권합니다. 서버 설정을 수정할 수 있다면 www 주소를 받는 VirtualHost에 한 줄로 넣습니다.

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    Redirect permanent / https://example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # SSL 인증서 줄은 기존 설정 그대로
    Redirect permanent / https://example.com/
</VirtualHost>

수정한 뒤에는 문법 검사 결과가 [Syntax OK]인지 확인하고 Apache 설정을 다시 불러옵니다.

apachectl configtest
Syntax OK
systemctl reload httpd

Debian 계열은 서비스 이름이 apache2라 [systemctl reload apache2]로 다시 불러옵니다.

🔲 Nginx server 블록 리디렉션

Nginx는 [return 301]로 같은 일을 하며, [$request_uri]가 경로와 쿼리 문자열을 그대로 이어 붙입니다.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name www.example.com;
    # SSL 인증서 줄은 기존 설정 그대로
    return 301 https://example.com$request_uri;
}

첫 server 블록은 80번 포트로 들어온 두 주소를, 둘째 블록은 https www 주소를 기본 주소로 보냅니다. 수정한 뒤에는 [nginx -t]로 문법을 확인하고 다시 불러옵니다.

🔲 워드프레스 주소와 사이트 주소

서버에서 www를 떼더라도 [설정 › 일반]의 [워드프레스 주소 (URL)]과 [사이트 주소 (URL)]이 www 주소로 남아 있으면 워드프레스가 다시 www 주소로 보내, 두 리디렉션이 서로를 되풀이합니다.

일반 설정 화면: 설정 메뉴 일반, 워드프레스 주소 (URL)과 사이트 주소 (URL) 칸

두 칸 모두 https로 시작하는 www 없는 주소로 저장합니다. 워드프레스도 www만 다른 주소로 들어온 페이지 요청은 사이트 주소 쪽으로 보내지만, 이미지 같은 정적 파일은 PHP를 거치지 않아 서버 규칙이 필요합니다.

🔲 curl로 리디렉션 확인

브라우저로 열기 전에 응답 코드와 이동할 주소를 curl로 먼저 확인합니다. http 주소는 한 번에 https 주소로 이동합니다.

curl -sI http://example.com/ | grep -iE '^(HTTP|location)'
HTTP/1.1 301 Moved Permanently
Location: https://example.com/

이동을 끝까지 따라가는 [-L] 옵션을 붙이면 www 주소가 몇 번 만에 도착하는지 보입니다.

curl -sIL http://www.example.com/ | grep -iE '^(HTTP|location)'
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/
HTTP/2 301
location: https://example.com/
HTTP/2 200 

이 서버는 http www 주소를 https www 주소로 한 번, 다시 www 없는 주소로 한 번 보낸 뒤 200으로 열었습니다. 위 htaccess 규칙처럼 두 조건을 한 규칙에 묶으면 301 한 번에 도착합니다.

🔲 htaccess 설정 시뮬레이터

아래 시뮬레이터에서 SSH, cPanel, FTP 가운데 접속 방법을 고르고 .htaccess를 열면, 왼쪽에서 누른 규칙의 줄로 바로 이동합니다. 리디렉션 칸과 워드프레스 칸이 모두 들어 있는 파일이라, 두 칸의 자리와 줄마다 하는 일을 한 파일에서 확인할 수 있습니다.

⚙️ .htaccess 설정설정 시뮬레이터
https와 www 제거 301 리디렉션
https 이동과 www 제거를 한 번에 처리하는 규칙은 [# BEGIN WordPress] 위에 따로 둡니다.
user_a@server: ~
Last login: Mon Oct 5 14:10:02 2026 from 10.0.0.12
[user_a@server ~]$
http로 들어오거나 www가 붙은 요청이면 https://example.com/ 뒤에 원래 경로를 붙여 301로 보냅니다. .htaccess에서는 경로가 앞의 슬래시 없이 [$1]에 담기므로 주소와 [$1] 사이의 슬래시를 빼지 않습니다.
이 규칙을 [# BEGIN WordPress] 안에 넣으면 고유주소를 저장할 때 지워지고, 워드프레스 칸 아래에 두면 그 칸 마지막 줄 [RewriteRule . /index.php]에서 처리가 끝나 글 주소 요청에는 닿지 않습니다.
RewriteEngine On
[RewriteEngine On]은 이 파일의 재작성 규칙을 사용하도록 켜는 줄이며, 리디렉션 칸과 워드프레스 칸에 각각 한 번씩 들어 있습니다.
Authorization 헤더 전달
이 줄은 Authorization 헤더를 PHP로 전달하며, 애플리케이션 비밀번호 같은 REST API 인증에서 사용합니다.
RewriteBase /
[RewriteBase /]는 규칙의 기준 경로를 웹 루트로 지정합니다.
index.php 요청 종료
index.php를 직접 요청한 경우에는 그대로 두고 처리를 종료합니다.
파일과 폴더 조건
두 줄의 [!-f]와 [!-d]는 실제 파일과 폴더 요청을 다음 줄에서 제외합니다.
index.php로 넘김
나머지 요청을 index.php로 넘겨 워드프레스가 주소를 해석합니다.
# BEGIN WordPress ~ # END WordPress
[# BEGIN WordPress]와 [# END WordPress] 사이는 워드프레스가 고유주소를 저장할 때마다 다시 기록하는 자리입니다. 직접 넣은 규칙이 이 안에 있으면 저장 한 번에 지워지므로, 리디렉션 같은 규칙은 이 두 줄 바깥 위쪽에 따로 둡니다.
[설정 › 고유주소]에서 [글 이름] 같은 구조를 고르고 [변경 사항 저장]을 누르면, 워드프레스가 .htaccess의 워드프레스 칸을 지금 구조에 맞춰 다시 기록합니다.
[<IfModule mod_rewrite.c>]는 mod_rewrite 모듈이 없는 서버에서 이 칸을 건너뛰게 하는 조건이며, 모듈이 있는 서버에서는 공식 문서 규칙과 똑같이 동작합니다.
브라우저 안에서만 동작하며 실제 파일은 변경하지 않습니다. 위에서 접속 방법을 고르고 칩을 차례로 눌러 .htaccess를 열면, 왼쪽에서 누른 규칙의 줄로 이동합니다. 칩 대신 터미널을 클릭해 명령어와 vi 키를 직접 입력할 수도 있습니다. 가상 서버에는 이 글에 필요한 파일만 들어 있으며, cPanel·FileZilla 화면은 실제 화면을 줄여 그린 것입니다.

5️⃣ 워드프레스 htaccess 500 오류 복구

.htaccess에 오타가 한 글자만 있어도 Apache는 그 폴더 아래 요청에 500 Internal Server Error를 돌려주므로, 수정은 사본을 만든 뒤 규칙을 써 넣고, 사이트 응답을 확인해 오류가 나면 되돌리는 순서로 진행합니다.

사본은 웹 루트 밖 홈 폴더에 둡니다. 웹 루트에 남긴 사본은 서버 설정에 따라 주소로 열려 누구나 내려받을 수 있습니다.

cp -p .htaccess ~/htaccess-before.bak

규칙을 써 넣은 뒤에는 첫 화면과 관리 화면, 이미지 같은 정적 파일 하나의 응답 코드를 확인합니다.

curl -s -o /dev/null -w '%{http_code}\n' https://example.com/
200

500이 나오면 사본으로 바로 되돌립니다.

cp -p ~/htaccess-before.bak .htaccess

되돌린 뒤 첫 화면이 다시 200으로 열리는지 확인하고, 원인은 Apache 오류 기록의 마지막 줄에서 찾습니다.

tail -n 20 /var/log/httpd/error_log

Debian 계열의 오류 기록은 /var/log/apache2/error.log이며, 잘못 쓴 지시어는 .htaccess 경로와 함께 기록됩니다.

🔢 FAQ & 추천 콘텐츠

이름이 점으로 시작하는 파일은 숨김 파일이라, FTP 프로그램과 파일 관리자에서 숨김 파일 보기를 켜야 목록에 나옵니다. SSH에서는 [ls -a]로 확인하며, 그래도 파일이 없으면 고유주소 설정을 한 번 저장하거나 위 기본 규칙으로 새로 만듭니다.

조건을 반대로 씁니다. 호스트 조건을 [!^www\.]로 바꿔 www가 없는 주소를 잡고, 이동할 주소를 [https://www.example.com/$1]로 바꾼 뒤 워드프레스 주소와 사이트 주소도 www 주소로 맞춥니다.

301은 영구 이동이라 브라우저가 새 주소를 기억해 두고, 규칙을 고친 뒤에도 옛 이동을 되풀이할 수 있습니다. 규칙을 다듬는 동안에는 [R=302]로 시험하고, 원하는 주소로 한 번에 도착하는 것을 확인한 뒤 [R=301]로 바꿉니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Prove your humanity: 3   +   8   =