워드프레스의 경우 글을 작성하면 "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 OnRewriteEngine 기능을 활성화한다.
RewriteBase /
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 를 참조.
주소를 다시 쓰길 원하는 시작(base) 부분 설정 한다. 예를들어 http://www.letmecompile.com/example/test 라는 요청이 들어왔을 때, RewriteBase가 /example 일 경우 test 부분만 rewrite 규칙이 적용되게 된다. 이경우에는 RewriteBase가 / 이므로 example/test 부분에 규칙이 적용된다.
반가반가방가워요.
또놀러올께요
pairplay 가 kr-dev 컨텐츠를 응원합니다! :)