Ubuntu 14.04에서 Apache용 mod_rewrite를 설정하는 방법


소개

이 자습서에서는 Apache2의 mod_rewrite 모듈을 사용하여 URL 재작성을 관리하는 방법을 활성화하고 배웁니다. 이 도구를 사용하면 사람이 읽을 수 있는 경로를 코드 친화적인 쿼리 문자열로 변환하여 보다 깔끔한 방식으로 URL을 다시 작성할 수 있습니다.

이 가이드는 두 부분으로 나뉩니다. 첫 번째는 샘플 웹 애플리케이션을 설정하고 두 번째는 일반적으로 사용되는 재작성 규칙을 설명합니다.

전제 조건

이 자습서를 따르려면 다음이 필요합니다.

  • 새로운 Ubuntu 14.04 드롭릿 1개
  • 이 튜토리얼의 2단계와 3단계에 따라 설정할 수 있는 루트가 아닌 sudo 사용자

1단계 - 아파치 설치

이 단계에서는 apt-get이라는 내장 패키지 설치 프로그램을 사용합니다. 관리를 획기적으로 단순화하고 깨끗한 설치를 용이하게 합니다.

먼저 시스템의 패키지 색인을 업데이트합니다. 이렇게 하면 오래되었거나 오래된 패키지가 설치를 방해하지 않습니다.

  1. sudo apt-get update

Apache2는 앞서 언급한 HTTP 서버이며 세계에서 가장 일반적으로 사용됩니다. 설치하려면 다음을 실행하십시오.

  1. sudo apt-get install apache2

Nginx와 가장 널리 사용되는 두 가지 오픈 소스 웹 서버인 Apache2의 차이점에 대한 정보는 이 기사를 참조하십시오.

2단계 - mod_rewrite 활성화

이제 mod_rewrite를 활성화해야 합니다.

  1. sudo a2enmod rewrite

이렇게 하면 모듈이 활성화되거나 모듈이 이미 적용 중임을 알려줍니다. 이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.

  1. sudo service apache2 restart

3단계 - .htaccess 설정

이 섹션에서는 더 간단한 재작성 규칙 관리를 위해 .htaccess 파일을 설정합니다.

.htaccess 파일을 사용하면 서버 구성 파일에 액세스하지 않고도 재작성 규칙을 수정할 수 있습니다. 이러한 이유로 .htaccess는 웹 애플리케이션의 보안에 매우 중요합니다. 파일 이름 앞에 마침표가 있으면 파일이 숨겨집니다.

시작하기 전에 몇 가지 설정을 더 설정하고 보호해야 합니다.

먼저 .htaccess 파일의 변경을 허용합니다. nano 또는 선호하는 텍스트 편집기를 사용하여 기본 Apache 구성 파일을 엽니다.

  1. sudo nano /etc/apache2/sites-enabled/000-default.conf

해당 파일 내에서 1행의 블록을 찾을 수 있습니다. 해당 블록 내에서 다음 블록을 추가합니다.

/etc/apache2/sites-available/default
<Directory /var/www/html> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory>

이제 파일이 다음과 일치해야 합니다. 모든 블록이 제대로 들여쓰기되었는지 확인하십시오.

/etc/apache2/sites-available/default
<VirtualHost *:80> <Directory /var/www/html> . . . </Directory> . . . </VirtualHost>

이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.

  1. sudo service apache2 restart

이제 .htaccess 파일을 생성합니다.

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

RewriteEngine을 활성화하려면 새 파일의 맨 위에 이 첫 번째 행을 추가하십시오.

/var/www/html/.htaccess
RewriteEngine on

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

다른 사용자가 귀하의 .htaccess읽을 수 있도록 하려면 다음 명령을 실행하여 권한을 업데이트하십시오.

  1. sudo chmod 644 /var/www/html/.htaccess

이제 웹 애플리케이션의 라우팅 규칙을 관리하기 위한 운영 .htaccess 파일이 있습니다.

4단계 - 파일 설정

이 섹션에서는 예쁜 URL을 실제 코드 경로로 변환하는 기본 URL 재작성을 설정합니다. 특히 사용자가 example.com/about에 액세스할 수 있습니다.

about.html이라는 파일을 만드는 것으로 시작하겠습니다.

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

다음 코드를 HTML 페이지에 복사합니다.

/var/www/html/about.html
<html> <head> <title>About Us</title> </head> <body> <h1>About Us</h1> </body> </html>

your_server_ip/about.html 또는 example.com/about.html에서 웹 애플리케이션에 액세스할 수 있습니다. 이제 about.html만 액세스할 수 있습니다. your_server_ip/about에 액세스하려고 하면 찾을 수 없음 오류가 발생합니다. 대신 사용자가 about에 액세스할 수 있기를 바랍니다. 우리의 재작성 규칙은 바로 이 기능을 허용합니다.

.htaccess 파일을 엽니다.

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

첫 번째 줄 뒤에 다음을 추가합니다.

/var/www/html/.htaccess
RewriteRule ^about$ about.html [NC]

이제 파일은 다음과 동일해야 합니다.

/var/www/html/.htaccess
RewriteEngine on RewriteRule ^about$ about.html [NC]

축하해요. 이제 브라우저에서 example.com/about에 액세스할 수 있습니다!

이것은 모든 재작성 규칙이 따르는 일반적인 구문을 보여주는 좋은 간단한 예입니다.

^about$는 URL에서 일치하는 문자열입니다. 즉, 시청자가 브라우저에 입력하는 내용입니다. 이 예에서는 몇 가지 메타문자를 사용합니다.

  • ^example.com/이 제거된 후 URL의 시작을 나타냅니다.
  • $는 URL의 끝을 나타냅니다
  • about은 문자열 "about\과 일치합니다.

about.html은 사용자가 액세스하는 실제 경로입니다. 즉, Apache는 여전히 about.html 파일을 제공합니다.

[NC]는 URL의 대문자를 무시하는 플래그입니다.

위에 표시된 규칙을 사용하면 다음 URL이 about.html을 가리킵니다.

  • example.com/about
  • example.com/About
  • example.com/about.html

다음은 그렇지 않습니다.

  • example.com/about/
  • example.com/contact

일반적인 패턴

이 섹션에서는 일반적으로 사용되는 몇 가지 지시문을 보여줍니다.

이제 웹 응용 프로그램이 실행 중이며 보호된 .htaccess 파일에 의해 관리됩니다. 가장 간단한 예가 위에 포함되어 있습니다. 이 섹션에서 추가로 두 가지 예를 살펴보겠습니다.

원하는 경우 결과 경로에 예제 파일을 설정할 수 있지만 이 자습서에는 HTML 및 PHP 파일 생성이 포함되어 있지 않습니다. 재작성 규칙만 있으면 됩니다.

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

모든 RewriteRule은 다음 형식을 따릅니다.

RewriteRule pattern substitution [flags]

  • RewriteRule: RewriteRule 지시문을 지정합니다.
  • 패턴: 원하는 문자열과 일치하는 정규식
  • 대체: 실제 URL 경로
  • 플래그: 규칙을 수정할 수 있는 선택적 매개변수

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

http://example.com/results.php?item=shirt&season=summer

이 예에서는 다음과 같이 단순화하려고 합니다.

http://example.com/shirt/summer

예 1A: 단순 교체

재작성 규칙을 사용하면 다음을 사용할 수 있습니다.

/var/www/html/.htaccess
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

위의 내용은 실제로 shirt/summerresults.php?item=shirt&season=summer에 매핑하므로 자명합니다. 이것은 우리가 원하는 효과를 얻습니다.

예 1B: 매칭 옵션

그러나 우리는 이것을 모든 계절을 포함하도록 일반화하고 싶습니다. 따라서 다음을 수행합니다.

  • | 부울("OR\을 의미)을 사용하여 일련의 옵션을 지정합니다.
  • ()를 사용하여 일치 항목을 그룹화한 다음 $1을 사용하여 그룹을 참조하고 첫 번째 일치 그룹에 대해 1을 사용

재작성 규칙은 이제 다음과 같습니다.

/var/www/html/.htaccess
RewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1

위에 표시된 규칙은 shirt/ 뒤에 지정된 계절이 오는 URL과 일치합니다. 해당 시즌은 ()를 사용하여 그룹화한 다음 후속 경로에서 $1로 참조합니다. 이는 예를 들어 다음을 의미합니다.

http://example.com/shirt/winter

된다:

http://example.com/results.php?item=shirt&season=winter

이것은 또한 원하는 효과를 얻습니다.

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

그러나 /shirt의 URL뿐만 아니라 모든 유형의 항목을 지정하고 싶습니다. 따라서 다음을 수행합니다.

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

/var/www/html/.htaccess
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2

위의 내용은 예를 들어 다음과 같이 변환됩니다.

http://example.com/pants/summer

에게:

http://example.com/results.php?item=pants&season=summer

예 1D: 쿼리 문자열 전달

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

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

다음으로 매핑:

http://example.com/results.php?item=pants&season=summer&page=2

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

/var/www/html/.htaccess
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

예 2: 논리로 조건 추가

RewriteCond를 사용하면 재작성 규칙에 조건을 추가할 수 있습니다. 모든 RewriteCond는 다음 형식을 따릅니다.

RewriteCond TestString Condition [Flags]

  • RewriteCond: RewriteCond 지시어 지정
  • TestString: 테스트할 문자열
  • 조건: 일치시킬 패턴
  • 플래그: 조건을 수정할 수 있는 선택적 매개변수

RewriteCond가 true로 평가되면 바로 뒤따르는 RewriteRule이 고려됩니다.

예 2A: 기본 페이지

가상의 관리 패널에서 사용자에게 404로 인사하는 대신 형식이 잘못된 모든 URL을 홈 페이지로 되돌리고 싶을 수 있습니다. 조건을 사용하여 요청된 파일이 존재하는지 확인할 수 있습니다.

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

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

위와 같이:

  • %{REQUEST_FILENAME}는 확인할 문자열입니다.
  • !-f는 파일 이름에 ! not 연산자를 사용합니다
  • RewriteRule은 모든 요청을 /admin/home으로 다시 리디렉션합니다.

보다 구문적으로나 기술적으로 올바른 접근 방식은 404 ErrorDocument를 정의하는 것입니다.

/var/www/html/.htaccess
ErrorDocument 404 /error.html

예 2B: IP 액세스 제한

이것은 다른 방법을 사용하여 달성할 수도 있지만 RewriteCond를 사용하여 하나의 IP 또는 IP 주소 모음에 대한 액세스를 제한할 수 있습니다.

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

/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$ RewriteRule (.*) - [F,L]

이 예제는 단순히 이전 mod_rewrite 기사의 예제 3을 부정한 것입니다. 전체 진술은 "주소가 12.34.56.789가 아닌 경우 액세스를 허용하지 않습니다.\라고 읽습니다.

요컨대:

  • %{REMOTE_ADDR}는 주소 문자열입니다.
  • !^(12\\.34\\.56\\.789)$\\ 백슬래시로 모든 . 마침표를 이스케이프하고 !
  • 를 사용하는 IP 주소\n
  • F 플래그는 액세스를 금지하고 L 플래그는 이것이 실행될 경우 마지막으로 실행할 규칙임을 나타냅니다.

12.34.56.789를 차단하려면 대신 다음을 사용하십시오.

/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$ RewriteRule (.*) - [F,L]

원래 기사의 2부에서 더 많은 재작성 규칙과 핫 링크를 방지하는 방법을 찾을 수 있습니다.

결론

mod_rewrite는 사람이 읽을 수 있는 URL을 보장하기 위해 효과적으로 사용될 수 있습니다. .htaccess 파일 자체는 단순히 이 모듈보다 더 많은 용도가 있지만 그 기능을 확장하기 위해 다른 많은 Apache 모듈을 설치할 수 있다는 점에 유의해야 합니다.

mod_rewrite의 기능을 자세히 설명하는 다른 리소스가 있습니다.

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

mod_rewrite는 웹 애플리케이션 보안을 위한 중요한 모듈이지만 때때로 리디렉션 루프 또는 편재하고 모호한 500 금지 오류로 끝날 수 있습니다. .htaccess 디버깅에 대한 팁은 이 StackOverflow 게시물을 참조하세요.

다시 쓰기 규칙은 정규식으로 작성됩니다. 전문가가 되려면 정규식에 대한 모든 자습서를 참조하십시오.

정규식 패턴을 빠르게 분석하기 위해 정규식 패턴에 대한 즉각적인 피드백과 실시간 해석을 제공할 수 있는 온라인 디버거가 있습니다.