본문 바로가기
PHP

[PHP] 분산 설정 파일 사용법

by teamnova 2024. 2. 1.

안녕하세요 오늘은 APACHE 서버에서 PHP를 사용할 때 유용하게 쓰이는 분산 설정 파일에 대해 알아보겠습니다.

 

처음 웹서버를 만드시고 개발을 하시다 보면 URL을 그냥 index.php 등 php파일을 그대로 노출하면서 접속하는 방법을 주로 쓰실텐데요, 그냥 혼자 공부하면서 개발하실 때는 크게 문제가 되진 않지만 해당 방식을 계속 사용하면 웹 서비스에 디렉토리가 바로 노출이 되니 보안상 그렇게 좋은 방법은 아닙니다.

 

이런 경우 분산 설정 파일(.htaccess)를 사용하면  그런 문제를 일부 해결할 수 있는데요.

분산 설정 파일을 사용하기 위해서 먼저 .htaccess의 구조에 대해서 알아보겠습니다.

 

해당 파일은 파일명 없이 확장자만 .htaccess로 생성된 파일입니다.

Router 설정을 적용할 디렉토리에 .htaccess 파일을 생성하시면 됩니다.

Options -MultiViews
RewriteEngine On
RewriteBase /
Options -Indexes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_URI} !(.js$)
RewriteCond %{REQUEST_URI} !(.css$)
RewriteCond %{REQUEST_URI} !(.ico$)
RewriteCond %{REQUEST_URI} !(phpinfo.php$)
RewriteRule ^(.*)$ Index.php?htaccess=$1 [QSA,L]

 

Options : 특정 디렉토리에서 어떤 옵션들을 활성화하고 비활성화할지 선택할 수 있습니다. 

Options - MultiViews : MultiViews 옵션을 비활성화 하는 것을 의미합니다.(해당 옵션이 활성화일 경우 Apache는 클라이언트가 요청한 파일이 존재하지 않을 때 유사한 이름을 가진 다른 파일을 찾아 제공하려고 시도합니다.)

Options - Indexes : 특정 디렉토리에 대해 자동으로 생성되는 디렉토리 목록 보기 기능을 비활성화하는 데 사용됩니다. 예를 들어 Apache 웹 서버는 인덱스 파일이 없을 경우 해당 디렉토리의 파일 목록을 자동으로 생성하여 보여주는데 그 기능을 비활성화하는 것입니다.

 

RewriteEngine On : 웹서버에서 URL 재작성을 활성화해 웹사이트 URL를 매우 유연하게 다룰 수 있게 해줍니다. 해당 기능을 활성화한 뒤 RewriteRule, RewriteCond 같은 명령을 사용해 규칙을 재정의합니다.

 

RewriteBase / : 서버의 root폴더를 어디에 두는 것인지 설정하는 파일입니다. 즉 localhost가 오면 어떤 폴더부터 시작하는지 알려주는 것입니다. 해당 구문은 따로 변경하지 않고 웹서버의 root폴더를 그대로 사용한다는 것을 의미합니다.

 

RewriteCond :  하단의 RewriteRule의 URL 재설정으로 가기 위한 필터의 역할입니다. 그래서 모든 URL들은 RewriteRule에 의해서 재설정이 되지만 phpinfo.php라는 파일만은 RewriteRule을 재설정하지 않고 그대로 localhost/phpinfo.php라고 보여주고 싶을때 위와 같이 작성 [RewriteCond %{REQUEST_URI} !(phpinfo.php$)] 하면 됩니다.

RewriteCond %{REQUEST_FILENAME} !-d: 이 조건은 요청된 파일명(%{REQUEST_FILENAME})이 디렉토리(-d)가 아닐 경우에만 다음 규칙을 적용하라는 것을 의미합니다.

RewriteCond %{REQUEST_FILENAME} !-f: 요청된 파일명이 실제 파일(-f)이 아닌 경우에만 규칙을 적용합니다.

RewriteCond %{REQUEST_FILENAME} !-l: 요청된 파일명이 심볼릭 링크(-l)가 아닐 경우에만 규칙을 적용합니다.

RewriteCond %{REQUEST_URI} !(.js$): 요청된 URI가 .js 파일로 끝나지 않는 경우에만 규칙을 적용합니다.

RewriteCond %{REQUEST_URI} !(.css$): 요청된 URI가 .css 파일로 끝나지 않는 경우에만 규칙을 적용합니다.

RewriteCond %{REQUEST_URI} !(.ico$): 요청된 URI가 .ico 파일로 끝나지 않는 경우에만 규칙을 적용합니다.

 

RewriteRule : 요청된 URL을 다른 URL로 변환하는 규칙을 정의하는 데 사용됩니다.

RewriteRule ^(.*)$ index.php?htaccess=$1 [QSA,L] : 모든 요청 (^(.*)$)에 대해, 위의 조건들이 모두 충족되면 요청을 index.php?htaccess=$1로 재작성한다는 것을 의미합니다. 여기서 $1은 RewriteRule 뒤에 표현되 정규표현식의 패턴을 나타냅니다. QSA 플래그는 원래의 쿼리 스트링을 재작성된 URL에 추가하고, L 플래그는 이 규칙이 적용된 후 다른 재작성 규칙을 더 이상 적용하지 않도록 합니다. 그래서 예를 들어 localhost/test?data=123 이라는 요청이 오게 되면 해당 요청 URL을 localhost/index.php?htaccess=test&data=123으로 변경하는 것입니다.

 

결국 위 설정실제 파일, 디렉토리, 심볼릭 링크가 아니며, .js, .css, .ico 파일이 아닌 모든 요청을 index.php로 재작성하고 단일 진입점 웹 애플리케이션으로 만드는 설정입니다. 그래서 모든 요청을 중앙 PHP 파일로 라우팅한 뒤에 처리할 수 있습니다.

 

이러한 설정을 적용하기 위해선느 먼저 Apache 설정을 조금 수정해야 합니다.

LoadModule rewrite_module modules/mod_rewrite.so의 주석(#)을 해제합니다.

AllowOverride부분을 None에서 All로 수정합니다.

 

그리고 위에서 보여드렸던 예시처럼 htaccess 파일을 생성합니다.

그후 index.php 파일을 다음과 같이 작성합니다.

<?php
?>
<!DOCTYPE html>
<html>
<head>
<title>title</title>
</head>
<body>
parameter = <?=$_GET["htaccess"]?>
</body>
</html>

 

그리고 localhost/helloworld를 브라우저에서 실행하게 되면 다음과 같은 화면을 볼 수 있습니다.

GET["htaccess"] 값에 "helloworld"가 들어간 것을 확인할 수 있습니다.

 

이렇게 분산 설정 파일을 사용해서 .php 형식이 아닌 형태로 url를 변경하는 법을 알아보았습니다.

감사합니다.