웹사이트 검색

Ubuntu 16.04에서 Apache용 mod_rewrite로 URL을 다시 쓰는 방법


소개

이 튜토리얼에서는 Apache 2의 mod_rewrite 모듈을 사용하여 URL 재작성을 활성화하고 관리하는 방법을 배웁니다. 이 모듈을 사용하면 사람이 읽을 수 있는 경로를 코드 친화적인 쿼리 문자열로 변환하거나 추가 조건에 따라 URL을 리디렉션하여 보다 깔끔한 방식으로 URL을 다시 작성할 수 있습니다.

이 가이드는 두 부분으로 나뉩니다. 첫 번째는 예제 웹 사이트를 설정하고 간단한 재작성 예제를 다룹니다. 두 번째 부분에는 일반적으로 사용되는 재작성 규칙의 두 가지 더 자세한 예가 포함되어 있습니다.

전제 조건

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

  • 루트가 아닌 sudo 사용자 및 방화벽을 포함하여 이 초기 서버 설정 자습서로 설정된 Ubuntu 16.04 서버 1대
  • Ubuntu 16.04에 Linux, Apache, MySQL, PHP(LAMP) 스택을 설치하는 방법의 1단계에 따라 서버에 Apache 2를 설치했습니다.

1단계 - mod_rewrite 활성화

먼저 mod_rewrite를 활성화해야 합니다. 사용할 수 있지만 깨끗한 Apache 2 설치에서는 사용할 수 없습니다.

  1. sudo a2enmod rewrite

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

  1. sudo systemctl restart apache2

mod_rewrite가 이제 완전히 활성화되었습니다. 다음 단계에서는 리디렉션에 대한 재작성 규칙을 정의하는 데 사용할 .htaccess 파일을 설정합니다.

2단계 - .htaccess 설정

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

참고: .htaccess 파일에 넣을 수 있는 모든 규칙은 서버 구성 파일에 직접 넣을 수도 있습니다. 실제로 Apache가 더 빠르게 처리하기 때문에 공식 Apache 문서에서는 .htaccess 대신 서버 구성 파일을 사용할 것을 권장합니다.

그러나 이 간단한 예에서는 성능 향상이 미미할 것입니다. 또한 .htaccess에 규칙을 설정하는 것이 특히 같은 서버에 있는 여러 웹사이트에서 편리합니다. 변경 사항을 적용하기 위해 서버를 다시 시작할 필요가 없으며 해당 규칙을 편집하기 위해 루트 권한이 필요하지 않으므로 유지 관리가 간소화되고 권한 없는 계정으로 변경이 가능합니다. Wordpress 및 Joomla와 같은 일부 인기 있는 오픈 소스 소프트웨어는 종종 소프트웨어가 필요에 따라 추가 규칙을 수정하고 생성하기 위해 .htaccess 파일에 의존합니다.

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

기본적으로 Apache는 재작성 규칙을 적용하기 위해 .htaccess 파일을 사용하는 것을 금지하므로 먼저 파일에 대한 변경을 허용해야 합니다. nano 또는 선호하는 텍스트 편집기를 사용하여 기본 Apache 구성 파일을 엽니다.

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

해당 파일 내에서 첫 번째 줄에서 시작하는 블록을 찾을 수 있습니다. 해당 블록 내부에 다음 새 블록을 추가하여 구성 파일이 다음과 같이 보이도록 합니다. 모든 블록이 제대로 들여쓰기되었는지 확인하십시오.

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    
    . . .
</VirtualHost>

파일을 저장하고 닫습니다. 이러한 변경 사항을 적용하려면 Apache를 다시 시작하십시오.

  1. sudo systemctl restart apache2

이제 웹 루트에 .htaccess 파일을 생성합니다.

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

재작성 엔진을 활성화하려면 새 파일의 맨 위에 이 행을 추가하십시오.

RewriteEngine on

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

이제 웹 애플리케이션의 라우팅 규칙을 관리하는 데 사용할 수 있는 운영 .htaccess 파일이 있습니다. 다음 단계에서는 재작성 규칙을 시연하는 데 사용할 샘플 웹 사이트 파일을 생성합니다.

3단계 - URL 재작성 구성

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

웹 루트에 about.html이라는 파일을 생성하여 시작합니다.

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

다음 HTML 코드를 파일에 복사한 다음 저장하고 닫습니다.

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

http://your_server_ip/about.html에서 이 페이지에 액세스할 수 있지만 http://your_server_ip<에 액세스하려고 하면 /mark>/about, 404 찾을 수 없음 오류가 표시됩니다. 대신 단순히 about을 사용하여 사용자가 페이지에 액세스하도록 하려면 재작성 규칙이 바로 이 기능을 허용합니다.

모든 RewriteRules는 다음 형식을 따릅니다.

RewriteRule pattern substitution [flags]

  • RewriteRule은 지시문을 지정합니다.
  • pattern은 뷰어가 브라우저에 입력하는 URL의 원하는 문자열과 일치하는 정규식입니다.
  • 대체는 실제 URL의 경로, 즉 Apache 서버 파일의 경로입니다.
  • 플래그는 규칙 작동 방식을 수정할 수 있는 선택적 매개변수입니다.

.htaccess 파일을 엽니다.

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

첫 번째 줄 뒤에 빨간색으로 표시된 RewriteRule을 추가하고 파일을 저장합니다.

RewriteEngine on
RewriteRule ^about$ about.html [NC]

이 경우 ^about$는 패턴이고 about.html은 대체이며 [NC]는 플래그입니다. 이 예에서는 특별한 의미가 있는 몇 가지 문자를 사용합니다.

  • ^your_server_ip/ 뒤의 URL 시작을 나타냅니다.
  • $는 URL의 끝을 나타냅니다.
  • about은 문자열 "about\과 일치합니다.
  • about.html은 사용자가 액세스하는 실제 파일입니다.
  • [NC]는 대소문자를 구분하지 않는 규칙을 만드는 플래그입니다.

이제 브라우저에서 http://your_server_ip/about에 액세스할 수 있습니다. 실제로 위에 표시된 규칙을 사용하면 다음 URL이 about.html을 가리킵니다.

  • http://your_server_ip/about, 규칙 정의 때문입니다.
  • http://your_server_ip/About, 규칙은 대소문자를 구분하지 않기 때문입니다.
  • http://your_server_ip/about.html, 원래 적절한 파일 이름이 항상 작동하기 때문입니다.

다음은 그렇지 않습니다.

  • http://your_server_ip/about/, 규칙에서 $ 문자.
  • http://your_server_ip/contact, 규칙의 about 문자열과 일치하지 않기 때문입니다.

이제 필요에 따라 수정하고 확장할 수 있는 간단한 규칙이 포함된 운영 .htaccess 파일이 있습니다. 다음 섹션에서는 일반적으로 사용되는 지시문의 두 가지 추가 예를 보여줍니다.

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

웹 애플리케이션은 주소 뒤에 물음표(?)를 사용하여 URL에 추가되는 쿼리 문자열을 사용하는 경우가 많습니다. 개별 매개변수는 앰퍼샌드(&)를 사용하여 구분됩니다. 쿼리 문자열은 개별 애플리케이션 페이지 간에 추가 데이터를 전달하는 데 사용될 수 있습니다.

예를 들어, PHP로 작성된 검색 결과 페이지는 http://example.com/results.php?item=shirt&season=summer와 같은 URL을 사용할 수 있습니다. 이 예에서 가상의 result.php 애플리케이션 스크립트에 두 개의 추가 매개변수가 전달됩니다. season을 summer 값으로 바꿉니다. 애플리케이션은 쿼리 문자열 정보를 사용하여 방문자에게 적합한 페이지를 구축할 수 있습니다.

아파치 재작성 규칙은 위와 같은 길고 불쾌한 링크를 시각적으로 입력하고 해석하기 쉬운 친근한 URL로 단순화하기 위해 종종 사용됩니다. 이 예에서는 위의 링크를 http://example.com/shirt/summer가 되도록 단순화하려고 합니다. shirtsummer 매개변수 값은 여전히 주소에 있지만 쿼리 문자열과 스크립트 이름은 없습니다.

이를 구현하는 한 가지 규칙은 다음과 같습니다.

RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

shirt/summer는 요청된 주소에서 명시적으로 일치하며 Apache는 대신 results.php?item=shirt&season=summer를 제공하도록 지시받습니다.

[QSA] 플래그는 재작성 규칙에서 일반적으로 사용됩니다. 그들은 제공되는 URL에 추가 쿼리 문자열을 추가하도록 Apache에 지시하므로 방문자가 http://example.com/shirt/summer?page=2를 입력하면 서버 results.php?item=shirt&season=summer&page=2로 응답합니다. 이것이 없으면 추가 쿼리 문자열이 삭제됩니다.

이 방법을 사용하면 원하는 효과를 얻을 수 있지만 항목 이름과 시즌이 모두 규칙에 하드코딩됩니다. 즉, 바지와 같은 다른 항목이나 겨울과 같은 계절에는 규칙이 작동하지 않습니다.

규칙을 보다 일반적으로 만들기 위해 정규식을 사용하여 원래 주소의 일부를 일치시키고 해당 부분을 대체 패턴에 사용할 수 있습니다. 수정된 규칙은 다음과 같이 표시됩니다.

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

괄호 안의 첫 번째 정규식 그룹은 shirt 또는 pants와 같은 영숫자와 숫자가 포함된 문자열을 일치시키고 일치하는 조각을 $1 변수로 저장합니다. 괄호 안의 두 번째 일반 표현 그룹은 정확히 summer, winter, fall 또는 spring과 일치하며 유사하게 일치하는 조각은 $2입니다.

그러면 일치하는 조각이 하드코딩된 셔츠여름 값 대신 항목시즌 변수의 결과 URL에 사용됩니다. 우리는 전에 사용했습니다.

예를 들어 위의 코드는 http://example.com/pants/summerhttp://example.com/results.php?item=pants&season=summer 로 변환합니다. . 이 예는 또한 단일 규칙을 사용하여 여러 항목과 계절을 올바르게 다시 작성할 수 있도록 하는 미래 보장형입니다.

예 2 - RewriteConds를 사용하여 논리로 조건 추가

다시 쓰기 규칙은 제한 없이 항상 하나씩 평가되는 것은 아닙니다. RewriteCond 지시문을 사용하면 재작성 규칙에 조건을 추가하여 규칙이 처리되는 시기를 제어할 수 있습니다. 모든 RewriteConds는 다음 형식을 따릅니다.

RewriteCond TestString Condition [Flags]

  • RewriteCondRewriteCond 지시문을 지정합니다.
  • TestString은 테스트할 문자열입니다.
  • 조건은 일치시킬 패턴 또는 조건입니다.
  • 플래그는 조건 및 평가 규칙을 수정할 수 있는 선택적 매개변수입니다.

RewriteCond가 true로 평가되면 바로 뒤따르는 RewriteRule이 고려됩니다. 그렇지 않으면 규칙이 삭제됩니다. 여러 RewriteCond를 차례대로 사용할 수 있으며 기본 동작으로 다음 규칙을 고려하려면 모두 true로 평가되어야 합니다.

예를 들어 표준 404 찾을 수 없음 오류 페이지를 표시하는 대신 사이트의 존재하지 않는 파일 또는 디렉토리에 대한 모든 요청을 홈 페이지로 다시 리디렉션한다고 가정해 보겠습니다. 이는 다음 조건 규칙으로 달성할 수 있습니다.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

위와 같이:

  • %{REQUEST_FILENAME}는 확인할 문자열입니다. 이 경우 모든 요청에 사용할 수 있는 시스템 변수인 요청된 파일 이름입니다.
  • -f는 요청된 이름이 디스크에 존재하고 파일인지 확인하는 기본 제공 조건입니다. !는 부정 연산자입니다. 조합하여 !-f는 지정된 이름이 없거나 파일이 아닌 경우에만 true로 평가됩니다.
  • 마찬가지로 !-d는 지정된 이름이 없거나 디렉토리가 아닌 경우에만 true로 평가됩니다.

마지막 줄의 RewriteRule은 존재하지 않는 파일이나 디렉터리에 대한 요청에만 적용됩니다. RewriteRule 자체는 매우 간단하며 모든 요청을 / 웹사이트 루트로 리디렉션합니다.

mod_rewrite는 사람이 읽을 수 있는 URL을 보장하는 데 효과적으로 사용할 수 있는 유용한 Apache 모듈입니다. 이 자습서에서는 RewriteRule 지시문을 사용하여 쿼리 문자열이 있는 URL을 포함하여 URL을 리디렉션하는 방법을 배웠습니다. 또한 RewriteCond 지시문을 사용하여 조건부로 URL을 리디렉션하는 방법도 배웠습니다.

mod_rewrite에 대해 자세히 알아보려면 mod_rewrite에 대한 Apache의 공식 문서를 살펴보세요.