mod_rewrite의 기능을 이해하려면 먼저 웹 서버의 작동 방식을 이해해야합니다. 웹 서버는 HTTP 요청에 응답 합니다 . 가장 기본적인 수준의 HTTP 요청은 다음과 같습니다.
GET /foo/bar.html HTTP/1.1
이것은 URL /foo/bar.html
을 요청하는 웹 서버에 대한 브라우저의 간단한 요청입니다 . 파일을 요청하지 않고 임의의 URL 만 요청한다는 점을 강조하는 것이 중요합니다 . 요청은 다음과 같습니다.
GET /foo/bar?baz=42 HTTP/1.1
이것은 URL에 대한 유효한 요청이며 파일과는 더 관련이 없습니다.
웹 서버는 포트에서 수신하는 응용 프로그램으로, 해당 포트에서 들어오는 HTTP 요청을 수락하고 응답을 반환합니다. 웹 서버는 사용자가 응답하도록 구성한 방식으로 어떤 방식 으로든 요청에 응답 할 수 있습니다. 이 응답은 파일이 아니며 디스크의 실제 파일과 관련이 있거나 없을 수 있는 HTTP 응답 입니다. 웹 서버는 아파치 일 필요는 없으며, 지속적으로 실행되고 HTTP 요청에 응답하는 포트에 연결된 프로그램 일 뿐인 다른 많은 웹 서버가 있습니다. 직접 쓸 수 있습니다. 이 단락은 URL이 파일과 직접 동일한 개념으로 이해하기 위해 작성되었습니다. 이해해야합니다. :)
대부분의 웹 서버의 기본 구성은 하드 디스크의 URL과 일치하는 파일을 찾는 것입니다. 서버 의 문서 루트 가로 설정되어 있으면 /var/www
파일 /var/www/foo/bar.html
이 존재 하는지 확인하여 파일 을 제공 할 수 있습니다. 파일이 ".php"로 끝나면 PHP 인터프리터를 호출 한 다음 결과 를 반환합니다. 이 모든 연관성을 완전히 구성 할 수 있습니다. 웹 서버가 PHP 인터프리터를 통해 파일을 실행하기 위해 파일이 ".php"로 끝나지 않아도되며 URL은 디스크의 특정 파일과 일치하지 않아도 발생합니다.
mod_rewrite는 내부 요청 처리 를 다시 쓰는 방법 입니다. 웹 서버가 URL에 대한 요청을 수신 하면 웹 서버가 디스크에서 파일과 일치하는 파일을 찾기 전에 해당 URL을 다른 것으로 다시 작성할/foo/bar
수 있습니다 . 간단한 예 :
RewriteEngine On
RewriteRule /foo/bar /foo/baz
이 규칙은 요청이 "/ foo / bar"와 일치 할 때마다 "/ foo / baz"로 다시 작성합니다. 그러면 요청이 요청 된 것처럼 처리 /foo/baz
됩니다. 다음과 같은 다양한 효과에 사용할 수 있습니다.
RewriteRule (.*) $1.html
이 규칙 일치 아무것도 ( .*
) 및 캡처는 그것을 ( (..)
), 다음은 ".html 중에서"를 추가 할 재 작성. 즉, /foo/bar
요청 된 URL 인 경우 /foo/bar.html
요청 된 것처럼 처리됩니다 . 정규식 일치, 캡처 및 대체에 대한 자세한 내용은 http://regular-expressions.info 를 참조하십시오 .
자주 발생하는 또 다른 규칙은 다음과 같습니다.
RewriteRule (.*) index.php?url=$1
이것은 다시 무엇이든 일치시키고 url
query 매개 변수 에 원래 요청 된 URL을 추가하여 index.php 파일에 다시 씁니다 . 즉, 들어오는 모든 요청에 대해 index.php 파일이 실행 되고이 파일은의 원래 요청에 액세스 $_GET['url']
할 수 있으므로 원하는 모든 작업을 수행 할 수 있습니다.
기본적으로 이러한 다시 쓰기 규칙을 웹 서버 구성 파일에 넣습니다 . 또한 아파치는 .htaccess
문서 루트 (예 : .php 파일 옆) 에있는 파일에 파일을 넣을 수 있도록합니다 * .
* 기본 Apache 구성 파일에서 허용하는 경우 선택 사항이지만 종종 사용됩니다.
mod_rewrite가하지 않는 것
mod_rewrite가 모든 URL을 마술처럼 아름답게 만들지는 않습니다. 이것은 일반적인 오해입니다. 웹 사이트에이 링크가있는 경우 :
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
mod_rewrite가 그것을 예쁘게 만들기 위해 할 수있는 일은 없습니다. 이 링크를 예쁘게 만들려면 다음을 수행해야합니다.
링크를 예쁜 링크로 변경하십시오.
<a href="https://stackoverflow.com/my/pretty/link">
서버에서 mod_rewrite를 /my/pretty/link
사용하여 위에서 설명한 방법 중 하나를 사용 하여 URL에 대한 요청을 처리하십시오 .
mod_substitute
나가는 HTML 페이지와 포함 된 링크를 변환하는 데 함께 사용할 수 있습니다 . HTML 리소스를 업데이트하는 것보다 일반적으로 더 많은 노력이 필요합니다.
mod_rewrite가 수행 할 수있는 작업과 여러 번의 다시 쓰기 연결, 완전히 다른 서비스 또는 시스템에 대한 요청 프록시, 특정 HTTP 상태 코드를 응답으로 반환, 요청 리디렉션 등을 포함하여 만들 수있는 매우 복잡한 일치 규칙이 있습니다. 매우 강력하고 사용할 수 있습니다. 기본 HTTP 요청-응답 메커니즘을 이해하면 좋습니다. 자동으로 링크를 예쁘게 만들지 는 않습니다 .
가능한 모든 플래그 및 옵션에 대해서는 공식 문서 를 참조하십시오 .