웹사이트 검색

CentOS 7에서 Apache용 mod_rewrite를 설정하는 방법


소개

Apache는 모듈을 활성화 및 비활성화하여 기능을 사용자 정의할 수 있는 모듈식 웹 서버입니다. 이를 통해 관리자는 웹 응용 프로그램의 요구 사항에 맞게 Apache의 기능을 조정할 수 있습니다.

이 튜토리얼에서는 CentOS 7 서버에 Apache를 설치하고 mod_rewrite 모듈이 활성화되었는지 확인하고 몇 가지 필수 기능을 탐색합니다.

전제 조건

이 자습서를 따르기 전에 sudo 권한이 있는 루트가 아닌 일반 사용자가 있는지 확인하십시오. CentOS에서 Sudo 사용자를 만드는 방법 가이드에서 이러한 권한을 가진 사용자를 설정하는 방법에 대해 자세히 알아볼 수 있습니다.

1단계 – 아파치 설치

CentOS의 기본 패키지 관리 유틸리티인 yum을 사용하여 Apache를 설치합니다.

  1. sudo yum install httpd

Is this ok [y/d/N]: 메시지가 표시되면 Y를 입력하고 ENTER 키를 눌러 설치를 승인합니다.

다음으로 systemctl 유틸리티를 사용하여 요청을 처리하기 위해 하위 프로세스 또는 스레드 풀을 생성하는 독립 실행형 프로세스인 Apache 데몬을 시작합니다.

  1. sudo systemctl start httpd

Apache가 성공적으로 시작되었는지 확인하려면 status 명령으로 상태를 확인하십시오.

  1. sudo systemctl status httpd
Output
. . . systemd[1]: Starting The Apache HTTP Server... systemd[1]: Started The Apache HTTP Server.

Apache가 실행 중이면 해당 모듈에 주의를 기울이겠습니다.

2단계 – mod_rewrite 확인

CentOS 버전 7부터는 mod_rewrite Apache 모듈이 기본적으로 활성화됩니다. 로드된 모든 모듈 목록을 인쇄하는 httpd 명령과 -M 플래그를 사용하여 이것이 사실인지 확인합니다.

  1. httpd -M
Output
. . . remoteip_module (shared) reqtimeout_module (shared) rewrite_module (shared) setenvif_module (shared) slotmem_plain_module (shared) . . .

rewrite_module이 출력에 나타나지 않으면 vi 편집기로 00-base.conf 파일을 편집하여 활성화하십시오.

  1. sudo vi /etc/httpd/conf.modules.d/00-base.conf

텍스트 파일이 열리면 i를 입력하여 삽입 모드로 들어간 다음 아래 강조 표시된 줄을 추가하거나 주석 처리를 제거하십시오.

#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
. . .
LoadModule rewrite_module modules/mod_rewrite.so
. . .

이제 ESC를 눌러 삽입 모드를 종료합니다. 그런 다음 :x를 입력한 다음 ENTER 키를 눌러 파일을 저장하고 종료합니다.

다음으로 Apache를 다시 시작하여 구성 변경 사항을 적용합니다.

  1. sudo systemctl restart httpd

Apache가 설치되고 mod_rewrite 모듈이 활성화되면 .htaccess 파일 사용을 구성할 준비가 된 것입니다.

3단계 – .htaccess 파일 설정

.htaccess 파일을 사용하면 서버 구성 파일을 변경하지 않고 도메인별로 RewriteRule을 포함하여 Apache에 대한 지시문을 정의할 수 있습니다. Linux에서 앞에 점(.)이 있는 파일은 숨겨진 파일로 처리됩니다.

.htaccess 파일을 사용하기 전에 Apache 지시문을 덮어쓸 수 있도록 AllowOverride 설정을 업데이트해야 합니다.

  1. sudo vi /etc/httpd/conf/httpd.conf

섹션을 찾아 AllowOverride 지시문을 None에서 All로 변경합니다.

. . .
<Directory /var/www/html>
. . .
 # 
 # AllowOverride controls what directives may be placed in .htaccess files.
 # It can be "All", "None", or any combination of the keywords:
 # Options FileInfo AuthConfig Limit
 #
 AllowOverride All
. . .
</Directory>
. . .

파일을 저장하고 종료한 다음 Apache를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo systemctl restart httpd

다음으로 Apache의 기본 문서 루트인 /var/www/html.htaccess 파일을 만듭니다.

  1. sudo vi /var/www/html/.htaccess

다음 줄을 파일 맨 위에 추가하여 RewriteEngine을 활성화합니다. 그러면 Apache가 다음 규칙을 처리하도록 지시합니다.

RewriteEngine On

파일을 저장하고 종료합니다.

이제 필요에 따라 URL을 조작하는 규칙을 정의할 수 있는 .htaccess 파일이 있습니다. 실제 규칙을 작성하기 전에 잠시 시간을 내어 기본 mod_rewrite 구문을 검토해 보겠습니다.

4단계 - RewriteRule 구문 탐색

RewriteRule 지시문을 사용하면 URL을 기반으로 Apache에 요청을 다시 매핑할 수 있습니다. .htaccess 파일은 하나 이상의 재작성 규칙을 수용할 수 있지만 런타임 시 Apache는 정의된 순서대로 규칙을 적용합니다. 재작성 규칙은 다음 구조로 구성됩니다.

RewriteRule 패턴 대체[플래그]

  • RewriteRule: RewriteRule 지시어 지정
  • 패턴: 원하는 문자열과 일치하는 PCRE(Perl 호환 정규식)입니다. 여기에서 정규 표현식에 대해 자세히 알아볼 수 있습니다.
  • 대체: 일치하는 요청을 보낼 위치
  • [플래그]: 규칙을 수정하기 위한 선택적 매개변수입니다. 사용 가능한 플래그 및 해당 의미에 대한 자세한 내용은 Rewrite Flags에 대한 Apache 문서를 참조하세요.

RewriteRulemod_rewrite 지시문의 주역이며, 이것이 이 자습서에서 주로 집중하는 이유입니다.

5단계 - RewriteCond 구문 탐색

RewriteCond 지시문을 사용하면 다시 쓰기 규칙에 조건을 추가할 수 있습니다. 다시 쓰기 조건은 다음 구조로 구성됩니다.

RewriteCond TestString 조건 [플래그]

  • RewriteCond: RewriteCond 지시어 지정
  • TestString: 테스트할 문자열
  • 조건: 일치시킬 패턴
  • [플래그]: 조건을 수정하기 위한 선택적 매개변수입니다.

RewriteCond 지시문은 특정 조건이 true로 평가되지 않는 한 Apache가 뒤따르는 재작성 규칙을 고려하도록 허용하지 않습니다.

6단계 – 파일 설정

사용자가 웹 브라우저의 주소 표시줄에 파일 확장자(.html)를 입력하지 않고 about.html 페이지를 방문할 수 있도록 기본 재작성 규칙을 설정할 것입니다. 문서 루트 디렉터리에 about.html 파일을 생성하여 시작합니다.

  1. sudo vi /var/www/html/about.html

다음 HTML 코드를 파일에 복사합니다.

<!DOCTYPE html>
<html>
    <head>
        <title>About Us</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
</html>

파일을 저장하고 종료합니다.

웹 브라우저에서 다음 주소로 이동합니다.

http://server_domain_or_IP/about.html

회사 소개가 있는 흰색 페이지가 표시되어야 합니다. 주소 표시줄에서 .html을 제거하고 페이지를 다시 로드하면 404 찾을 수 없음 오류가 표시됩니다. Apache는 전체 파일 이름으로만 구성 요소에 액세스할 수 있지만 재작성 규칙으로 이를 변경할 수 있습니다.

7단계 - RewriteRule 설정

About Us 페이지 방문자가 .html을 입력하지 않고도 액세스할 수 있기를 바랍니다. 이를 달성하기 위해 규칙을 만듭니다.

.htaccess 파일을 엽니다.

  1. sudo vi /var/www/html/.htaccess

RewriteEngine On 줄 뒤에 다음을 추가합니다.

RewriteRule ^about$ about.html [NC]

파일을 저장하고 종료합니다.

방문자는 이제 http://server_domain_or_IP/about URL을 사용하여 About Us 페이지에 액세스할 수 있습니다.

재작성 규칙을 살펴보겠습니다.

^about$는 URL에서 일치하는 패턴과 사용자가 브라우저에 입력하는 내용으로 사용됩니다.

  • ^server_domain_or_IP/가 제거된 후 URL의 시작을 나타냅니다.
  • &는 URL의 끝을 의미합니다

about.html은 Apache가 일치하는 패턴을 만났을 때 제공하는 파일의 경로를 보여줍니다.

[NC]는 사용자가 URL에 소문자와 대문자를 입력할 수 있도록 재작성 규칙이 대소문자를 구분하지 않도록 지시하는 플래그입니다. 예를 들어 다음 URL은 about.html 파일을 가리킵니다.

  • server_domain_or_IP/about
  • server_domain_or_IP/정보
  • server_domain_or_IP/정보

간단한 재작성 규칙을 통해 사용자가 About Us 페이지에 액세스할 수 있는 방법에 동적 측면을 추가했습니다.

일반적인 패턴

이제 재작성 규칙에 대한 기본적인 이해가 있으므로 이 섹션에서 두 가지 추가 예를 살펴보겠습니다.

예제 파일을 설정할 수 있지만 이 튜토리얼에는 예제 파일 생성이 포함되어 있지 않습니다. 다시 쓰기 규칙 자체입니다.

예 1: RewriteRule을 사용하여 쿼리 문자열 단순화

웹 애플리케이션은 종종 물음표 문자(?)를 사용하여 URL에 추가되고 앰퍼샌드 문자(&)로 구분되는 쿼리 문자열을 사용합니다. Apache는 재작성 규칙을 일치시킬 때 이 두 문자를 무시합니다. 그러나 때로는 페이지 간에 데이터를 전달하기 위해 쿼리 문자열이 필요할 수 있습니다. 예를 들어 PHP로 작성된 검색 결과 페이지의 URL은 다음과 같습니다.

http://example.com/results.php?item=shoes&type=women

대신 방문자가 다음과 같은 보다 깔끔한 URL을 사용할 수 있기를 바랍니다.

http://example.com/shoes/women

간단한 교체 또는 일치 옵션을 통해 두 가지 방법 중 하나로 이러한 결과를 얻을 수 있습니다.

예 1A: 단순 교체

간단한 교체를 수행하여 긴 쿼리 URL을 단순화하는 재작성 규칙을 생성합니다.

RewriteRule ^shoes/women$ results.php?item=shoes&type=women

규칙은 shoes/womenresults.php?item=shoes&type=women에 매핑합니다.

예 1B: 매칭 옵션

경우에 따라 다양한 유형의 신발을 포함하도록 쿼리 문자열을 일반화할 수 있습니다. 다음을 수행하여 이 작업을 수행할 수 있습니다.

  • 수직 파이프 |, 부울 "OR\ 연산자를 사용하여 일련의 옵션 지정
  • ()를 사용하여 일치 항목을 그룹화한 다음 $1 변수를 사용하여 그룹을 참조하고 첫 번째 일치 그룹에 대해 1을 사용

다시 쓰기 규칙은 이제 다음과 같습니다.

RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1

위에 표시된 규칙은 shoes/ 뒤에 지정된 유형이 오는 URL과 일치합니다. 이렇게 하면 원래 URL이 다음과 같이 수정됩니다.

http://example.com/shoes/men

된다:

http://example.com/results.php?item=shoes&type=men

이 일치 옵션을 통해 Apache는 각각에 대해 별도의 재작성 규칙을 만들지 않고도 여러 패턴을 평가할 수 있습니다.

예제 1C: 일치하는 문자 세트

그러나 /shoes로 제한하지 않고 모든 항목을 지정하고 싶습니다. 따라서 다음을 수행합니다.

  • 모든 영숫자 문자와 일치하는 정규식을 작성합니다. 대괄호 식 [ ]는 그 안의 모든 문자와 일치하고 +는 대괄호 안에 지정된 모든 문자와 일치합니다.
  • 일치 항목을 그룹화하고 $2를 파일의 두 번째 변수로 참조합니다.

RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2

위의 예는 다음을 변환합니다.

http://example.com/pants/men

에게:

http://example.com/results.php?item=pants&type=men

URL의 여러 측면을 포함하도록 일치 기능을 성공적으로 확장했습니다.

예 1D: 쿼리 문자열 전달

이 섹션에서는 새로운 개념을 소개하지 않지만 발생할 수 있는 문제를 다룹니다. 위의 예를 사용하여 http://example.com/pants/men을 리디렉션하고 싶지만 추가 쿼리 문자열 ?page=2를 전달한다고 가정해 보겠습니다. 다음 URL을 매핑하고 싶습니다.

http://example.com/pants/men?page=2

에게:

http://example.com/results.php?item=pants&type=men&page=2

현재 설정으로 위의 URL에 액세스하려고 하면 쿼리 문자열 page=2가 손실되는 것을 발견할 수 있습니다. 이는 쿼리 문자열이 결합되도록 하는 추가 QSA 플래그를 사용하여 쉽게 수정됩니다. 다음과 일치하도록 재작성 규칙을 수정하면 원하는 동작을 얻을 수 있습니다.

RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA]

예 2: 논리로 조건 추가

이제 RewriteCond 지시문의 사용을 살펴보겠습니다. 재작성 조건이 참으로 평가되면 Apache는 그 뒤에 오는 RewriteRule을 고려합니다.

예 2A: 기본 페이지

이전에는 Apache가 404 Not Found 페이지를 전달하여 유효하지 않은 URL에 대한 요청을 처리하는 것을 보았습니다. 그러나 오류 페이지 대신 모든 잘못된 형식의 URL이 홈페이지로 다시 리디렉션되기를 바랍니다. 조건을 사용하여 요청한 파일이 존재하는지 확인할 수 있습니다.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home

이렇게 하면 /admin/random_text와 같은 항목이 /admin/home으로 리디렉션됩니다.

위의 규칙을 분석해 보겠습니다.

  • %{REQUEST_FILENAME}는 요청된 문자열을 확인합니다.
  • !-f ! or not 연산자는 요청된 파일 이름이 존재하지 않는 경우 다음 재작성 규칙을 실행하도록 지정합니다.
  • RewriteRule은 요청을 /admin/home으로 다시 리디렉션합니다.

404 ErrorDocument 정의는 모범 사례를 따릅니다. 이를 위해 404 오류를 error.html 페이지로 가리키는 ErrorDocument 규칙을 만듭니다.

ErrorDocument 404 /error.html

그러면 error.html 페이지에 대한 HTTP 404 응답이 발생하는 모든 요청이 리디렉션됩니다.

예 2B: IP 주소 제한

RewriteCond는 특정 IP 주소로 사이트에 대한 액세스를 허용하는 데 사용할 수 있습니다.

이 예는 198.51.100.24를 제외한 모든 곳에서 오는 트래픽을 차단합니다.

RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]

전체 규칙에 따르면 리소스를 요청하는 IP 주소가 198.51.100.24가 아니면 액세스를 허용하지 않습니다.

요컨대:

  • %{REMOTE_ADDR}는 주소 문자열입니다.
  • !^(198\\.51\\.100\\.24)$는 IP 주소를 부정합니다. \\ 백슬래시는 . 점을 이스케이프 처리합니다. 그렇지 않으면 모든 문자를 일치시키는 데 사용되는 메타문자 역할을 하기 때문입니다.
  • F 플래그는 액세스를 금지하고 L 플래그는 이것이 실행될 경우 마지막으로 실행할 규칙임을 나타냅니다.

특정 주소의 액세스를 차단하려면 대신 다음을 사용하십시오.

RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]

다른 방법을 사용하여 사이트에 대한 트래픽을 차단하거나 허용할 수 있지만 .htaccess 파일에 제한을 설정하는 것이 이러한 결과를 얻는 가장 쉬운 방법입니다.

결론

이 자습서에서는 .htaccess 파일을 사용하여 RewriteRuleRewriteCond 지시문을 사용했습니다. 재작성 규칙을 사용하는 데는 여러 가지 이유가 있으며 다음 리소스는 mod_rewrite 모듈의 기능을 자세히 설명합니다.

  • Apache mod_rewrite 소개
  • mod_rewrite에 대한 Apache 설명서
  • mod_rewrite 치트 시트

mod_rewrite 모듈은 Apache 웹 서버의 중요한 구성 요소이며 이를 사용하여 많은 작업을 수행할 수 있습니다. 그러나 상황이 항상 계획대로 진행되는 것은 아니며 그런 일이 발생하면 리디렉션 루프 또는 모호한 500 금지됨 오류가 발생할 수 있습니다. 이러한 종류의 상황을 디버깅하는 방법에 대한 팁은 이 StackOverflow 게시물을 검토하세요.