IT News/PHP

rewrite on (rewrite mode)가 잘 않될때 해결방법 : 가상호스트 서비스에서 RewriteEngine on 과 htaccess 파일 설정

Fshop 2018. 12. 6. 19:20
반응형


아파치에서 rewrite 모듈을 활성화 하기 위해서는 httpd.conf 파일에서 rewrite_module 를 로드해야한다. 기본적으로 httpd.conf 파일의 위치는 설치된 OS 즉 운영체제에 다르겠지만 Cent OS 를 기준으로 말씀드리겠습니다.

/etc/httpd/conf/httpd.conf 위치에 해당 파일이 있습니다. 이 파일을 vi 에디터를 통해서 보면은 하단에 LoadModule 이 있는 부분이 있는데요. 거기에서 아래와 같은 문장에 주석(#)이 되어있는지 체크합니다.

LoadModule rewrite_module modules/mod_rewrite.so


만약에 rewtire 모듈이 정상적으로 로드가 되도록 되어있다고 한다면 웹 폴더 경로에서 .htaccess 파일을 확인해 봐야 합니다. 만약에 .htaccess 파일이 없다면 생성을 하셔야 합니다. 그리고 .htaccess 파일의 첫 시작 부분에 RewriteEngine on 을 적어주어야 합니다.

아래의 예시는 제가 개인적으로 사용하는 예시인데요. RewriteCond 는 rewrite condition 의 줄임말로 어떠한 조건일때라는 것을 의미하구요. RewriteRule 은 RewriteCond 의 조건에 해당된다면 어떻게 하라는 룰을 지정하는 것이라 생각하시면 됩니다. 

아래의 예시는 URL 주소에서 입력된 내용이 폴더가 아니거나 또는 파일이 아닌 경우에 확장자 php 를 붙이는 방법이라 보시면 됩니다. 그리고 맨 하단에 있는 ErrorDocument 는 각 해당되는 에러코드에 따라서 어떠한 파일로 연결되게 할지를 설정할 수 있는데요. 여기서는 무조건 errors.php 로 연결되도록 하였습니다.


RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^([^.]+) $1.php


ErrorDocument 400 errors.php

ErrorDocument 403 errors.php

ErrorDocument 404 errors.php

ErrorDocument 405 errors.php

ErrorDocument 408 errors.php

ErrorDocument 500 errors.php

ErrorDocument 502 errors.php

ErrorDocument 504 errors.php


그런데 만약에 위의 2개의 설정을 했는데요 rewrite 모듈이 정상적으로 동작하지 않는다면 .htaccess 파일을 파싱하는 부분에서 문제가 있는것인데요. 저의 경우에는 virtual host 를 두어서 한 서버에서 여러개의 도메인으로 서비스를 하고 있는데요. 이런 경우에 권한 문제 때문에 문제가 생길 수가 있습니다.

저는 /etc/httpd/conf/httpd.conf 파일의 맨 하단에 아래와 같이 작성하였습니다. 아래와 같이 하면 아파치에서는 httpd-vhosts.conf 파일을 읽게 됩니다. 

 # Virtual hosts

Include /etc/httpd/conf/httpd-vhosts.conf


아래는 httpd-vhosts.conf 의 예시입니다. 그런데 아래와 같이 했더니 rewire module 이 동작을 않하는 것입니다. 

 <VirtualHost *:80>

DocumentRoot /var/www/html/home

ServerName home.mydomain.com
</VirtualHost>

그래서 폴더에 권한 설정 내용도 추가해 보았습니다. 추가한 내용은 아래의 빨간색으로 표시된 부분인데요. 기본 폴더 경로와 설정내용이 추가 되었습니다. 

<VirtualHost *:80>

DocumentRoot /var/www/html/home

ServerName home.mydomain.com

<Directory "/var/www/html/home">

  Order allow,deny

  Allow from all

  AllowOverride All

</Directory>

</VirtualHost>


위의 내용을 저장하고 service httpd restart 로 서버를 재시작하고 테스트를 해보니 정상적으로 동작하였습니다. 저도 이 부분에서 많이 고생?을 했는데요. 이러한 부분에서 조금이나마 도움이 되셨으면 좋겠습니다.

참고로 아래는 httpd.conf 파일의 예시입니다. 이미지 맨 하단에 보이는 include 부분이 가상호스트 파일을 읽는 부분입니다.

가상호스트 include


반응형