Apache Rewrite 규칙을 NGINX Rewrite 규칙으로 전환하기

이 포스트에서는 Apache HTTP 서버 Rewrite 규칙을 NGINX Plus 구문으로 전환하는 방법에 대해 설명합니다( 전환 방식은 NGINX Open Source에서도 동일합니다). Reverse Proxy 또는 Load Balancer 역할을 하도록 Apache 서버 앞에 NGINX Plus를 배치하거나 Apache 웹 서버를 NGINX Plus 웹 서버로 교체할 때 NGINX Rewrite 규칙으로 전환해야 합니다. NGINX와 NGINX Plus는 디렉터리별 구성 파일(Apache의 .htaccess 파일)을 지원하지 않으므로 이를 전환할 필요가 있다는 점에 유의하세요.

목차

1. www 접두사를 추가하는 규칙 전환하기
2. “is not” 규칙 전환하기
3. WordPress Pretty Permalink를 활성화하는 규칙 전환하기
4. 동적 요청을 애플리케이션 서버로 전달하는 규칙 전환하기

1. www 접두사를 추가하는 Apache Rewrite 규칙 전환하기

이 Apache 규칙은 URL에 www 접두사를 추가합니다.

RewriteCond %{HTTP_HOST} example.org
RewriteRule (.*)         http://www.example.org$1

다음 NGINX Plus 구성은 올바르게 전환된 것입니다. 첫 번째 server 블록은 요청을 example.org와 일치시키고 www.example.org로 영구적으로 리다이렉션합니다. 두 번째 server 블록은 Rewrite된 URL(및 기타 모든 요청을 www.example.org)과 일치시킵니다.

# USE THIS CONVERSION
server {
    listen      80;
    server_name example.org;
    return      301 http://www.example.org$request_uri;
}
 
server {
    listen      80;
    server_name www.example.org;
    # ...
}

다음은 Apache Rewrite 규칙을 NGINX Rewrite 규칙으로 전환하는 자연스러운 방법처럼 보일 수 있지만 권장하지 않습니다. 권장하는 전환과 비교하면 두 가지 추가 처리 단계가 필요합니다: 먼저 if 조건을 검사한 다음 rewrite 지시문의 정규 표현식을 검사해야 합니다.

# NOT RECOMMENDED
server {
    listen      80;
    server_name www.example.org example.org;
    if ($http_host = example.org) {
        rewrite (.*) http://www.example.org$1;
    }
    # ...
}

2. “is not” Apache Rewrite 규칙 전환하기

이 Apache Rewrite 규칙은 “example.com이 아니고 www.example.com가 아닌”(이를 “upside‑down” 로직이라고 부를 수 있습니다) URL을 일치시켜 www.example.com로 다시 Rewrite합니다.

RewriteCond %{HTTP_HOST} !example.com
RewriteCond %{HTTP_HOST} !www.example.com
RewriteRule (.*)         http://www.example.com$1

NGINX Plus 전환의 경우 Apache RewriteCond 지시문의 “positive” 버전(즉, example.com 또는 www.example.com로 시작하는 URL과 일치)을 결합하는 server 블록과 “다른 모든 것”으로 정의되는 것과 일치하는 또 다른 server 블록을 명시적으로 정의합니다.

server {
    listen      80;
    server_name example.com www.example.com;
    # ...
}
 
server {
    listen      80 default_server;
    server_name _;
    return      301 http://www.example.com$request_uri;
}

3. WordPress Pretty Permalink를 활성화하는 Apache Rewrite 규칙 전환하기

WordPress.org는 Pretty Permalink를 활성화하는 아래의 Apache 지시문이 포함된 기본적인 .htaccess 파일을 배포합니다.

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

다음은 이에 상응하는 NGINX Plus 구성입니다.

location / {
    try_files $uri $uri/ /index.php?$args;
}

NGINX로 WordPress에 Pretty Permalink를 활성화하는 방법에 대한 자세한 내용은 nginxlibrary.com에서 WordPress Permalink를 참조하세요.

4. 동적 요청을 애플리케이션 서버로 전달하는 규칙 전환하기

관리자는 종종 다음과 같은 Apache Rewrite 규칙을 사용하여 정적 자산이 있는 경우 직접 제공하고 동적 요청은 애플리케이션 서버로 전달합니다.

DocumentRoot /var/www/myapp.com/current/public
 
RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ %{DOCUMENT_ROOT}/system/maintenance.html [L]
 
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ $1 [QSA,L]
 
RewriteCond %{REQUEST_FILENAME}/index.html -f
RewriteRule ^(.*)$ $1/index.html [QSA,L]
 
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html [QSA,L]
 
RewriteRule ^/(.*)$ balancer://app-server_cluster%{REQUEST_URI} [P,QSA,L]

구체적으로 규칙 블록은 이러한 기능을 수행합니다.

  • DocumentRoot 지시문은 콘텐츠가 저장되는 로컬 디스크 디렉터리를 지정합니다.
  • 첫 번째 규칙 블록은 /system/maintenance.html 파일의 존재 여부를 감지합니다. 웹사이트 관리자는 유지 관리로 인해 일시적으로 웹사이트를 사용할 수 없다는 신호로 이 파일을 생성하는 것이 일반적입니다. 파일이 존재하면 어떤 파일을 요청하든 해당 파일이 제공됩니다(사실상 이 규칙은 모든 요청을 maintenance.html로 Rewrite합니다). 그리고 Rewrite로 인해 브라우저에 유지 관리 알림이 전송될 수 있습니다.
  • 다음 세 블록은 이러한 정적 자산이 존재할 경우 이를 제공합니다.
    • 요청된 파일
    • URL 끝에 지정된 디렉터리에 있는 index.html 파일
    • 확장자가 .html인 모든 파일
  • 세 가지 유형의 파일 중 하나도 존재하지 않는 경우 마지막 규칙이 적용됩니다. 이 규칙은 요청을 애플리케이션 서버 클러스터로 전달합니다.

다음은 NGINX Plus에 대한 전환입니다. root 지시문은 Apache DocumentRoot 지시문에 해당합니다. try_files 지시문은 지정된 위치(@app-server_cluster)를 최종 Rewrite로 사용하고 애플리케이션 서버로 요청을 Proxy하는 해당 location 블록을 정의하여 나머지 규칙을 대체합니다:

location / {
    root       /var/www/myapp.com/current/public;
 
    try_files /system/maintenance.html
              $uri $uri/index.html $uri.html
              @app-server_cluster;
}
 
location @app-server_cluster {
    proxy_pass http://app-server;
}

NGINX 및 NGINX Plus를 사용하여 Rewrite 규칙을 구성해 테스트해 보려면 지금 30일 무료 평가판을 신청하거나 사용 사례에 대해 최신 소식을 빠르게 전달받고 싶으시면 아래 뉴스레터를 구독하세요.