Ubuntu 14.04에서 Apache용 mod_rewrite를 설정하는 방법
소개
이 자습서에서는 Apache2의 mod_rewrite
모듈을 사용하여 URL 재작성을 관리하는 방법을 활성화하고 배웁니다. 이 도구를 사용하면 사람이 읽을 수 있는 경로를 코드 친화적인 쿼리 문자열로 변환하여 보다 깔끔한 방식으로 URL을 다시 작성할 수 있습니다.
이 가이드는 두 부분으로 나뉩니다. 첫 번째는 샘플 웹 애플리케이션을 설정하고 두 번째는 일반적으로 사용되는 재작성 규칙을 설명합니다.
전제 조건
이 자습서를 따르려면 다음이 필요합니다.
- 새로운 Ubuntu 14.04 드롭릿 1개
- 이 튜토리얼의 2단계와 3단계에 따라 설정할 수 있는 루트가 아닌 sudo 사용자
1단계 - 아파치 설치
이 단계에서는 apt-get
이라는 내장 패키지 설치 프로그램을 사용합니다. 관리를 획기적으로 단순화하고 깨끗한 설치를 용이하게 합니다.
먼저 시스템의 패키지 색인을 업데이트합니다. 이렇게 하면 오래되었거나 오래된 패키지가 설치를 방해하지 않습니다.
- sudo apt-get update
Apache2는 앞서 언급한 HTTP 서버이며 세계에서 가장 일반적으로 사용됩니다. 설치하려면 다음을 실행하십시오.
- sudo apt-get install apache2
Nginx와 가장 널리 사용되는 두 가지 오픈 소스 웹 서버인 Apache2의 차이점에 대한 정보는 이 기사를 참조하십시오.
2단계 - mod_rewrite 활성화
이제 mod_rewrite
를 활성화해야 합니다.
- sudo a2enmod rewrite
이렇게 하면 모듈이 활성화되거나 모듈이 이미 적용 중임을 알려줍니다. 이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.
- sudo service apache2 restart
3단계 - .htaccess 설정
이 섹션에서는 더 간단한 재작성 규칙 관리를 위해 .htaccess
파일을 설정합니다.
.htaccess
파일을 사용하면 서버 구성 파일에 액세스하지 않고도 재작성 규칙을 수정할 수 있습니다. 이러한 이유로 .htaccess
는 웹 애플리케이션의 보안에 매우 중요합니다. 파일 이름 앞에 마침표가 있으면 파일이 숨겨집니다.
시작하기 전에 몇 가지 설정을 더 설정하고 보호해야 합니다.
먼저 .htaccess
파일의 변경을 허용합니다. nano
또는 선호하는 텍스트 편집기를 사용하여 기본 Apache 구성 파일을 엽니다.
- 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를 다시 시작하십시오.
- sudo service apache2 restart
이제 .htaccess
파일을 생성합니다.
- sudo nano /var/www/html/.htaccess
RewriteEngine
을 활성화하려면 새 파일의 맨 위에 이 첫 번째 행을 추가하십시오.
/var/www/html/.htaccessRewriteEngine on
파일을 저장하고 종료합니다.
다른 사용자가 귀하의 .htaccess
만 읽을 수 있도록 하려면 다음 명령을 실행하여 권한을 업데이트하십시오.
- sudo chmod 644 /var/www/html/.htaccess
이제 웹 애플리케이션의 라우팅 규칙을 관리하기 위한 운영 .htaccess
파일이 있습니다.
4단계 - 파일 설정
이 섹션에서는 예쁜 URL을 실제 코드 경로로 변환하는 기본 URL 재작성을 설정합니다. 특히 사용자가 example.com/about
에 액세스할 수 있습니다.
about.html
이라는 파일을 만드는 것으로 시작하겠습니다.
- 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
파일을 엽니다.
- sudo nano /var/www/html/.htaccess
첫 번째 줄 뒤에 다음을 추가합니다.
/var/www/html/.htaccessRewriteRule ^about$ about.html [NC]
이제 파일은 다음과 동일해야 합니다.
/var/www/html/.htaccessRewriteEngine 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/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer
위의 내용은 실제로 shirt/summer
를 results.php?item=shirt&season=summer
에 매핑하므로 자명합니다. 이것은 우리가 원하는 효과를 얻습니다.
예 1B: 매칭 옵션
그러나 우리는 이것을 모든 계절을 포함하도록 일반화하고 싶습니다. 따라서 다음을 수행합니다.
|
부울("OR\을 의미)을 사용하여 일련의 옵션을 지정합니다.()
를 사용하여 일치 항목을 그룹화한 다음$1
을 사용하여 그룹을 참조하고 첫 번째 일치 그룹에 대해1
을 사용
재작성 규칙은 이제 다음과 같습니다.
/var/www/html/.htaccessRewriteRule ^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/.htaccessRewriteRule ^([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/.htaccessRewriteRule ^([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/.htaccessRewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
이렇게 하면 /admin/blargh
와 같은 항목이 /admin/home
으로 리디렉션됩니다.
위와 같이:
%{REQUEST_FILENAME}
는 확인할 문자열입니다.!-f
는 파일 이름에!
not 연산자를 사용합니다RewriteRule
은 모든 요청을/admin/home
으로 다시 리디렉션합니다.
보다 구문적으로나 기술적으로 올바른 접근 방식은 404 ErrorDocument
를 정의하는 것입니다.
/var/www/html/.htaccessErrorDocument 404 /error.html
예 2B: IP 액세스 제한
이것은 다른 방법을 사용하여 달성할 수도 있지만 RewriteCond
를 사용하여 하나의 IP 또는 IP 주소 모음에 대한 액세스를 제한할 수 있습니다.
이 예는 12.34.56.789를 제외한 모든 위치에서 오는 트래픽을 차단합니다.
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]
이 예제는 단순히 이전 mod_rewrite 기사의 예제 3을 부정한 것입니다. 전체 진술은 "주소가 12.34.56.789가 아닌 경우 액세스를 허용하지 않습니다.\라고 읽습니다.
요컨대:
%{REMOTE_ADDR}
는 주소 문자열입니다.!^(12\\.34\\.56\\.789)$
는\\
백슬래시로 모든.
마침표를 이스케이프하고!
를 사용하는 IP 주소\nF
플래그는 액세스를 금지하고L
플래그는 이것이 실행될 경우 마지막으로 실행할 규칙임을 나타냅니다.
12.34.56.789를 차단하려면 대신 다음을 사용하십시오.
/var/www/html/.htaccessRewriteCond %{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 게시물을 참조하세요.
다시 쓰기 규칙은 정규식으로 작성됩니다. 전문가가 되려면 정규식에 대한 모든 자습서를 참조하십시오.
정규식 패턴을 빠르게 분석하기 위해 정규식 패턴에 대한 즉각적인 피드백과 실시간 해석을 제공할 수 있는 온라인 디버거가 있습니다.