[태그:] AllowOverride 설정

  • Apache 서버에서 .htaccess 설정이 적용되지 않는 원인과 해결 방법

    Apache 서버에서 .htaccess 설정이 적용되지 않는 원인과 해결 방법

    Apache 웹서버에서 .htaccess 파일을 수정했는데도 리디렉션이 작동하지 않거나, URL 재작성 규칙이 적용되지 않고, 접근 제한 설정이 무시되는 현상이 발생할 수 있습니다. 파일을 여러 번 수정해도 결과가 달라지지 않는다면 규칙 자체보다 Apache가 해당 파일을 읽고 있는지 먼저 확인해야 합니다.

    특히 워드프레스 고유주소를 변경한 뒤 404 오류가 발생하거나, HTTP를 HTTPS로 전환하는 규칙이 작동하지 않는 경우에는 .htaccess 설정과 Apache 서버 설정을 함께 점검해야 합니다.

    .htaccess 설정 미적용 문제는 AllowOverride None, mod_rewrite 비활성화, 잘못된 VirtualHost, 파일 위치 및 권한 문제, RewriteRule 작성 오류 등으로 발생할 수 있습니다.

    이번 글에서는 Apache 실행 환경 확인 → AllowOverride 설정 점검 → mod_rewrite 활성화 여부 확인 → VirtualHost와 파일 경로 분석 → RewriteRule 및 오류 로그 확인 순서로 원인을 살펴봅니다.

    Apache .htaccess 핵심 명령어 한눈에 보기

    Apache 설정을 변경하기 전에 현재 실행 중인 서버와 설정 파일의 위치를 확인해야 합니다. 다음은 Apache 2.4 환경에서 사용할 수 있는 대표적인 점검 명령어입니다.

    점검 목적 명령어
    Apache 버전 확인 apache2 -v 또는 httpd -v
    Apache 설정 파일 확인 apache2ctl -V 또는 apachectl -V
    활성 VirtualHost 확인 apache2ctl -S 또는 httpd -S
    활성 모듈 확인 apache2ctl -M 또는 httpd -M
    mod_rewrite 확인 apache2ctl -M | grep rewrite
    설정 문법 검사 sudo apache2ctl configtest
    파일 위치 및 권한 ls -la /var/www/html/.htaccess
    Apache 오류 로그 sudo journalctl -u apache2 -n 100

    배포판에 따라 Apache 명령어와 서비스 이름이 다를 수 있습니다. Ubuntu·Debian 계열에서는 주로 apache2, RHEL·Rocky Linux·AlmaLinux 계열에서는 httpd를 사용합니다.

    Apache .htaccess 설정 미적용 원인과 AllowOverride mod_rewrite VirtualHost 점검 방법
    Apache .htaccess 설정이 적용되지 않을 때 AllowOverride, mod_rewrite, VirtualHost 및 오류 로그를 확인하는 방법

    1. Apache가 .htaccess 파일을 읽지 않는 이유

    .htaccess는 Apache에서 디렉터리별 설정을 적용하기 위해 사용하는 파일입니다. 리디렉션, URL 재작성, 접근 제어 등 서버에서 허용한 설정을 디렉터리 단위로 지정할 수 있습니다.

    하지만 .htaccess 파일을 생성했다고 해서 Apache가 반드시 해당 파일을 읽는 것은 아닙니다.

    Apache의 AllowOverride 설정에 따라 디렉터리별 설정 파일을 읽을지 여부와 허용할 지시어 범위가 결정됩니다.

    예를 들어 다음과 같은 설정이 적용되어 있다면 .htaccess 파일은 처리되지 않습니다.

    <Directory "/var/www/html">
        AllowOverride None
        Require all granted
    </Directory>

    이 상태에서는 .htaccess에 RewriteRule이나 Redirect 규칙을 작성하더라도 해당 파일을 통한 설정이 적용되지 않습니다.

    따라서 규칙을 수정하기 전에 현재 사이트의 실제 DocumentRoot와 그 경로에 적용되는 Directory 설정을 확인해야 합니다.

    2. AllowOverride 설정 확인 및 수정하기

    Apache 2.4에서 AllowOverride는 .htaccess 사용 여부를 결정하는 핵심 설정입니다.

    Ubuntu·Debian 계열에서는 다음 경로를 우선 확인할 수 있습니다.

    /etc/apache2/apache2.conf
    /etc/apache2/sites-available/

    RHEL 계열에서는 다음 경로를 확인할 수 있습니다.

    /etc/httpd/conf/httpd.conf
    /etc/httpd/conf.d/

    관련 설정을 검색하려면 다음 명령어를 사용할 수 있습니다.

    sudo grep -RniE 'AllowOverride|AllowOverrideList|AccessFileName' \
      /etc/apache2/

    RHEL 계열에서는 검색 경로를 /etc/httpd/로 변경하면 됩니다.

    RewriteRule과 같은 FileInfo 계열 지시어를 .htaccess에서 사용해야 한다면 다음과 같이 필요한 범위만 허용할 수 있습니다.

    <Directory "/var/www/html">
        AllowOverride FileInfo
        Require all granted
    </Directory>

    이 설정은 FileInfo 범주에 해당하는 .htaccess 지시어를 허용하는 예시입니다.

    반면 다음 설정은 여러 종류의 디렉터리별 지시어를 허용합니다.

    AllowOverride All

    워드프레스 운영 환경에서 AllowOverride All을 사용하는 사례가 있지만, 모든 서버에서 반드시 All을 사용해야 하는 것은 아닙니다.

    보안과 관리 측면에서는 실제 필요한 지시어 범위만 허용하는 것이 좋습니다. 또한 AllowOverride는 서버 설정의 <Directory> 컨텍스트에 지정해야 하며, .htaccess 파일 내부에 작성하는 설정이 아닙니다.

    3. mod_rewrite 모듈 활성화 여부 확인하기

    .htaccess 파일은 읽히지만 RewriteRule이 작동하지 않는다면 mod_rewrite 모듈을 확인해야 합니다.

    Ubuntu·Debian 계열에서는 다음 명령어로 확인합니다.

    apache2ctl -M | grep rewrite

    정상적으로 로드되어 있다면 다음과 같은 결과가 나타날 수 있습니다.

    rewrite_module (shared)

    모듈이 활성화되어 있지 않다면 Ubuntu·Debian 계열에서 다음 명령어를 사용할 수 있습니다.

    sudo a2enmod rewrite

    RHEL 계열에서는 다음과 같이 확인할 수 있습니다.

    httpd -M | grep rewrite

    RHEL 계열은 Apache 패키지와 설정 구성에 따라 모듈 로드 방식이 다를 수 있으므로 현재 모듈 설정을 확인해야 합니다.

    mod_rewrite가 활성화되어 있어도 AllowOverride에서 해당 지시어를 허용하지 않으면 .htaccess의 RewriteRule이 적용되지 않을 수 있습니다.

    따라서 두 설정을 함께 점검해야 합니다.

    4. .htaccess 파일 위치와 DocumentRoot 확인하기

    Apache가 정상적으로 설정되어 있어도 .htaccess 파일이 실제 웹사이트 경로와 다른 위치에 있다면 원하는 규칙이 적용되지 않을 수 있습니다.

    먼저 현재 VirtualHost 구성을 확인합니다.

    apache2ctl -S

    RHEL 계열에서는 다음 명령어를 사용할 수 있습니다.

    httpd -S

    예를 들어 사이트 설정이 다음과 같다고 가정하겠습니다.

    <VirtualHost *:80>
        ServerName example.com
        DocumentRoot /var/www/example/public
    </VirtualHost>

    이 경우 웹사이트 루트에 적용할 .htaccess 파일은 일반적으로 다음 경로에 위치해야 합니다.

    /var/www/example/public/.htaccess

    하지만 파일을 /var/www/html/.htaccess에 작성했다면 해당 사이트에는 적용되지 않을 수 있습니다.

    실제 파일 위치를 확인합니다.

    ls -la /var/www/example/public/.htaccess

    또한 Apache는 요청한 파일 경로와 관련된 디렉터리 계층의 설정을 처리할 수 있으므로, 상위 디렉터리에 있는 설정 파일과 Directory 설정도 함께 확인해야 합니다.

    5. .htaccess 파일 권한과 소유권 확인하기

    파일 권한이 잘못되어 Apache 프로세스가 .htaccess를 읽지 못하면 설정 적용에 문제가 발생할 수 있습니다.

    다음 명령어로 권한을 확인합니다.

    ls -l /var/www/example/public/.htaccess

    일반적인 권한 예시는 다음과 같습니다.

    -rw-r--r-- 1 root root 512 Oct 8 10:00 .htaccess

    이 예시에서 파일 권한은 644입니다. 다만 실제 접근 가능 여부는 파일뿐 아니라 상위 디렉터리의 실행 권한, ACL 및 SELinux 설정에도 영향을 받을 수 있습니다.

    상위 디렉터리 권한을 확인하려면 다음 명령어를 사용할 수 있습니다.

    namei -l /var/www/example/public/.htaccess

    SELinux가 활성화된 환경이라면 보안 컨텍스트도 확인할 수 있습니다.

    ls -Z /var/www/example/public/.htaccess

    권한 문제를 해결한다는 이유로 chmod 777을 적용하는 것은 권장되지 않습니다.

    실제 Apache 실행 사용자와 디렉터리 접근 경로를 확인한 후 필요한 최소 권한만 부여해야 합니다.

    6. RewriteRule과 RewriteBase 설정 오류 확인하기

    .htaccess 파일이 정상적으로 읽히더라도 RewriteRule 작성 방식이 잘못됐다면 원하는 URL로 연결되지 않을 수 있습니다.

    다음은 존재하지 않는 파일과 디렉터리에 대한 요청을 index.php로 전달하는 일반적인 예시입니다.

    <IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [L]
    </IfModule>

    위 예시는 사이트 구조에 따라 수정해야 합니다.

    RewriteEngine On은 URL 재작성 기능을 활성화하며, RewriteCond는 규칙 적용 조건을 지정합니다.

    !-f는 요청 경로가 실제 일반 파일이 아닌 경우, !-d는 실제 디렉터리가 아닌 경우를 의미합니다.

    특히 .htaccess의 RewriteRule 패턴은 일반적인 서버 설정의 URL 패턴과 해석 방식이 다릅니다. 디렉터리별 컨텍스트에서는 해당 디렉터리의 URL 접두사가 제거된 경로를 기준으로 규칙이 평가됩니다.

    따라서 .htaccess에서 RewriteRule 패턴의 맨 앞에 /를 붙이면 예상과 다르게 동작할 수 있습니다.

    서브디렉터리에 설치된 애플리케이션에서는 RewriteBase가 필요한지 검토해야 하지만, 모든 RewriteRule에 반드시 필요한 설정은 아닙니다.

    7. 워드프레스 고유주소 변경 후 404 오류가 발생하는 경우

    워드프레스에서 고유주소 구조를 변경한 뒤 메인 페이지는 열리지만 개별 글이나 페이지에서 404 오류가 발생하는 경우가 있습니다.

    Apache 환경이라면 다음 항목을 확인해야 합니다.

    • 사이트의 DocumentRoot가 올바른지
    • 워드프레스 루트에 .htaccess 파일이 있는지
    • AllowOverride에서 RewriteRule 사용을 허용하는지
    • mod_rewrite가 활성화되어 있는지
    • 다른 VirtualHost나 프록시가 요청을 처리하고 있지 않은지

    워드프레스가 웹 루트에 설치된 일반적인 환경에서는 다음과 같은 재작성 규칙이 사용될 수 있습니다.

    # BEGIN WordPress
    <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>
    # END WordPress

    위 코드는 일반적인 루트 설치 환경의 예시이며, 워드프레스 설치 경로와 구성에 따라 달라질 수 있습니다.

    워드프레스 관리자 화면의 설정 → 고유주소에서 현재 구조를 확인하고 필요한 경우 변경사항을 저장해 재작성 규칙을 갱신할 수 있습니다.

    다만 Apache가 .htaccess를 읽지 않도록 설정되어 있다면 워드프레스에서 고유주소를 다시 저장해도 문제가 해결되지 않을 수 있습니다.

    8. Apache 오류 로그로 설정 문제 확인하기

    .htaccess가 적용되지 않는 원인을 확인하기 어려울 때는 Apache 오류 로그를 분석해야 합니다.

    Ubuntu·Debian 계열에서는 일반적으로 다음 경로를 확인합니다.

    sudo tail -n 100 /var/log/apache2/error.log

    RHEL 계열에서는 다음 경로를 확인할 수 있습니다.

    sudo tail -n 100 /var/log/httpd/error_log

    다만 VirtualHost별로 별도의 ErrorLog가 설정되어 있다면 해당 로그 파일을 확인해야 합니다.

    예를 들어 허용되지 않는 지시어가 .htaccess에 작성된 경우 다음과 비슷한 오류가 발생할 수 있습니다.

    RewriteEngine not allowed here

    이 메시지는 해당 디렉터리 컨텍스트에서 RewriteEngine 지시어를 사용할 수 없다는 의미입니다.

    반면 다음과 같은 메시지가 발생할 수도 있습니다.

    Invalid command 'RewriteEngine'

    이 경우에는 mod_rewrite 모듈이 로드되어 있는지 확인해야 합니다.

    실제 오류 문구는 Apache 버전과 설정에 따라 다를 수 있습니다.

    또한 .htaccess가 아예 무시되는 상황에서는 파일 내부의 잘못된 지시어가 로그에 나타나지 않을 수도 있습니다.

    9. Apache 설정 변경 후 적용되지 않는 경우

    .htaccess 파일은 일반적으로 요청 처리 과정에서 읽히므로 파일 내용만 수정한 경우 Apache를 반드시 재시작할 필요는 없습니다.

    하지만 AllowOverride, VirtualHost, 모듈 로드 설정 등 Apache의 서버 설정을 변경했다면 설정 검증 후 재로드가 필요할 수 있습니다.

    Ubuntu·Debian 계열에서는 다음 명령어로 문법을 검사합니다.

    sudo apache2ctl configtest

    RHEL 계열에서는 다음 명령어를 사용할 수 있습니다.

    sudo httpd -t

    설정이 정상이라면 다음과 같은 메시지가 나타날 수 있습니다.

    Syntax OK

    변경 내용을 적용하려면 운영 환경에 맞게 재로드합니다.

    # Ubuntu / Debian
    sudo systemctl reload apache2
    
    # RHEL / Rocky Linux / AlmaLinux
    sudo systemctl reload httpd

    재로드 후에도 설정이 적용되지 않는다면 실제 요청을 처리하는 웹서버가 Apache인지 확인해야 합니다.

    Nginx가 앞단에서 요청을 처리하거나 정적 파일을 직접 제공하는 환경에서는 Apache의 .htaccess 규칙이 해당 요청에 적용되지 않을 수 있습니다.

    특히 Nginx 자체는 .htaccess 파일을 해석하지 않으므로 Nginx만 사용하는 환경에서는 동등한 설정을 Nginx 서버 설정에 작성해야 합니다.

    실전 점검 순서

    Apache 서버에서 .htaccess 설정이 적용되지 않는다면 다음 순서로 점검할 수 있습니다.

    # 1. Apache 버전 확인
    apache2 -v
    
    # 2. VirtualHost 확인
    apache2ctl -S
    
    # 3. mod_rewrite 확인
    apache2ctl -M | grep rewrite
    
    # 4. AllowOverride 설정 검색
    sudo grep -RniE 'AllowOverride|AllowOverrideList|AccessFileName' /etc/apache2/
    
    # 5. .htaccess 파일 확인
    ls -la /var/www/html/.htaccess
    
    # 6. 상위 디렉터리 권한 확인
    namei -l /var/www/html/.htaccess
    
    # 7. Apache 설정 문법 검사
    sudo apache2ctl configtest
    
    # 8. Apache 오류 로그 확인
    sudo tail -n 100 /var/log/apache2/error.log
    
    # 9. 서버 설정을 변경했다면 재로드
    sudo systemctl reload apache2

    위 명령어는 Ubuntu·Debian 계열의 예시입니다. RHEL 계열에서는 httpd 명령어와 /etc/httpd/ 설정 경로를 사용해야 합니다.

    또한 /var/www/html은 예시 경로이므로 실제 VirtualHost의 DocumentRoot에 맞게 변경해야 합니다.

    운영 서버에서는 설정 파일을 수정하기 전에 원본을 백업하고, 변경 후 반드시 문법 검사를 진행해야 합니다.

    정리

    Apache 서버에서 .htaccess 설정 미적용 문제가 발생하는 원인은 AllowOverride None, mod_rewrite 비활성화, 잘못된 DocumentRoot, 파일 권한 문제, RewriteRule 오류 등 다양합니다.

    먼저 Apache가 실제로 .htaccess 파일을 읽도록 설정되어 있는지 확인하고, 해당 디렉터리에서 필요한 지시어가 허용되는지 점검해야 합니다.

    URL 재작성 규칙이 작동하지 않는다면 mod_rewrite 활성화 여부와 RewriteRule 작성 방식을 함께 확인하는 것이 중요합니다.

    특히 워드프레스 고유주소 변경 후 404 오류가 발생한다면 고유주소 설정만 반복해서 저장하기보다 Apache의 Directory 설정과 VirtualHost 구성을 먼저 점검해야 합니다.

    핵심 점검 순서는 Apache 실행 환경 확인 → AllowOverride 점검 → mod_rewrite 확인 → .htaccess 위치 및 권한 검사 → RewriteRule 분석 → 오류 로그 확인 → 설정 재로드입니다.