본문 바로가기
개발

아파치 conf, rewrite 주의사항

by 코타 2023. 8. 25.

아파치에서 rewrite 설정할 때 주의할 점

 

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

 

위와 같이 아파치 conf 설정을 할 경우
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

REQUEST_FILENAME 부분을 절대경로로 체크합니다.
그래서 우리가 원하는 DocumentRoot가 아닌
서버의 절대경로로 파일/디렉토리 여부를 체크합니다.

예시)
https://test.com/test.php 라는 요청을 했을 경우

1-1 파일이 없을 경우
서버 절대경로로 /test.php 위치에 파일 여부를 체크하고
없으면 RewriteRule에 의해 index.php로 리다이렉트 시킵니다.
prefixed with document_root to /{DocumentRoot}/index.php

{DocumentRoot} 이 부분은 보안상 이렇게 표기합니다. 실제론 절대경로.

그래서 test.php 파일을 못 찾아갑니다.


1-2 파일이 있을 경우
/test.php 경로에 파일이 있을 경우 리다이렉트 없이 파일을 잘 찾아갑니다.

이를 해결하기 위해선
index.php에서 파일 경로를 잘 찾아갈 수 있게 설정을 해줘야 합니다.

 

- 처리 방법

1. 소스에서 처리

$_SERVER['REQUEST_URI']를 파싱해서 요청을 구분합니다.
js, img, tpl 등의 정적 파일은 include를 해준 뒤 exit 처리를 하였고,
api는 데이터를 가져온 뒤 json으로 리턴할 수 있습니다.

 

2. apache conf에서 처리

# Apache conf

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d

 

DOCUMENT_ROOT를 포함해서 RewriteCond을 체크하도록 수정했습니다.

이렇게 설정을 할 경우 아래 로그를 확인할 수 있습니다.

RewriteCond: input='~~~~~~~(보안상 경로 숨김)~~~~~~~' => not-matched

 

DOCUMENT_ROOT/{요청경로}로 체크하기 때문에 파일이 존재하는 것을 제대로 체크했고,

리다이렉트 없이 존재하는 파일을 바로 내려줍니다.

 

- 로그 확인

httpd.conf 파일에 로그레벨을 설정해서 rewrite로그를 자세하게 확인 가능합니다.

LogLevel alert rewrite:trace8

 

반응형

'개발' 카테고리의 다른 글

이모지 입력 시 디비 에러  (0) 2023.09.19
피들러 인증서 오류 해결 방법  (0) 2023.09.19
mysql Disk is full writing 에러 처리  (0) 2023.06.27
phpstorm 화면 깨짐 오류  (0) 2023.05.25
Apache Options  (0) 2023.01.19

댓글