워드프레스 고유주소 원리

이글의 경우 “http://www.letmecompile.com/워드프레스-고유주소-원리” 라는 고유주소(permalink)를 갖는다. URL에는 디렉토리 구조처럼 나오면서도 워드프레스의 특정 포스트로 연결되는 이 고유주소 기능의 원리가 신기해서 구글링을 좀 해보았다.

apache http 서버의 mod_rewrite 모듈

apache의 모듈중에서 mod_rewrite 가 활성화 되어 있을경우 서버내의 .htaccess 파일에 RewriteRule을 정할 수 있다. 즉, 특정 RewriteCond을 만족하는 경우 지정된 RewriteRule이 적용되어 주소를 다시 쓰게 된다. 워드프레스의 고유주소를 위한 규칙은 다음과 같이 정의되어 있다.

RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

의미 단위별 설명

RewriteEngine On

RewriteEngine 기능을 활성화한다.

RewriteBase /

주소를 다시 쓰길 원하는 시작(base) 부분 설정 한다. 예를들어 http://www.letmecompile.com/example/test 라는 요청이 들어왔을 때, RewriteBase가 /example 일 경우 test 부분만 rewrite 규칙이 적용되게 된다. 이경우에는 RewriteBase가 / 이므로 example/test 부분에 규칙이 적용된다.

RewriteRule ^index.php$ – [L]

^index.php$는 정규식으로 “index.php” 스트링 자체를 의미한다 따라서 index.php에 대한 요청이 들어올경우 아무것도 하지 않는다(-) 는 의미이다. [L]의 경우 뒤에 나오는 RewriteRule들을 더이상 적용하지 않고 rewrite 프로세스를 종료하겠다는 의미를 가진다.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

%{REQUEST_FILENAME}를 이용하여 요청된 주소에 해당하는 파일(-f)이나 디렉토리(-d) 가 있는지 확인하고, 없을경우 어떤 주소로 요청이 되었던지간에(.) /index.php로 요청을 rewrite 한다. 즉, http://www.letmecompile.com/example-post-link 라는 요청이 http 서버로 들어왔을 때 조건식에 따라 example-post-link 라는 파일/디렉토리가 없을경우 해당 요청이 index.php 페이지로 전달된다. 따라서 index.php 안의 코드에서 $_SERVER[‘REQUEST_URI’] 변수를 통해 원래 요청 주소를 알 수 있고, 이를 이용해 DB에 저장된 고유주소(permalink)와 매칭되는 포스트를 불러오게 되는 것이다.

더 자세한 내용은 http://httpd.apache.org/docs/current/mod/mod_rewrite.html 를 참조.