RewriteBase
에만 적용되는 대상 (A)의 상대 재기록 룰.
이와 같이 RewriteBase를 사용하면 ...
RewriteBase /folder/
RewriteRule a\.html b.html
본질적으로 동일합니다 ...
RewriteRule a\.html /folder/b.html
그러나 .htaccess 파일이 내부에 있으면 /folder/
동일한 대상을 가리 킵니다.
RewriteRule a\.html b.html
문서가 항상을 사용하는 것을 암시하지만 RewriteBase
Apache는 다음과 같은 경우가 아니면 DocumentRoot 아래의 경로를 올바르게 감지합니다.
이 경우 RewriteBase를 지정해야 할 수도 있습니다.
그러나 혼동하는 지시문이므로 일반적으로 다시 쓰기 대상에 절대 (일명 '루트 상대') URI를 지정하는 것이 좋습니다. 규칙을 읽는 다른 개발자는 이러한 규칙을보다 쉽게 파악할 수 있습니다.
Jon Lin의 탁월한 심층 답변을 인용하면 다음과 같습니다 .
htaccess 파일에서 mod_rewrite는 <Directory>
또는 <Location>
컨테이너 와 유사하게 작동합니다 . 를 RewriteBase
사용하여 상대 경로 기반을 제공합니다.
예를 들어,이 폴더 구조가 있다고 가정하십시오.
DocumentRoot
|-- subdir1
`-- subdir2
`-- subsubdir
따라서 다음에 액세스 할 수 있습니다.
http://example.com/
(뿌리)
http://example.com/subdir1
(subdir1)
http://example.com/subdir2
(subdir2)
http://example.com/subdir2/subsubdir
(subsubdir)
를 통해 전송되는 URI RewriteRule
는 htaccess 파일을 포함하는 디렉토리에 상대적입니다. 당신이 가지고 있다면 :
RewriteRule ^(.*)$ -
- 루트 htaccess에서 요청은
/a/b/c/d
이면 캡처 된 URI ( $1
)는 a/b/c/d
입니다.
- 규칙이
subdir2
있고 요청이 있으면 /subdir2/e/f/g
캡처 된 URI는 e/f/g
입니다.
- 규칙이에 있고
subsubdir
요청이에 있으면 /subdir2/subsubdir/x/y/z
캡처 된 URI는 x/y/z
입니다.
규칙이있는 디렉토리에 해당 부분이 URI에서 제거되었습니다. 다시 쓰기 기반은 이것에 영향을 미치지 않습니다. 이것은 단순히 디렉토리 별 작동 방식입니다.
무엇 재 작성 기지 않는 일은하는 URL 경로 기본 (제공입니다 하지 에서 상대 경로에 대한 파일 경로 기준) 규칙의 목표를 . 따라서이 규칙이 있다고 가정하십시오.
RewriteRule ^foo$ bar.php [L]
다음 bar.php
과 반대되는 상대 경로입니다.
RewriteRule ^foo$ /bar.php [L]
여기서는 /bar.php
절대 경로입니다. 절대 경로는 항상 "루트"입니다 (위의 디렉토리 구조에서). 즉, 규칙이 "root", "subdir1", "subsubdir"등에 있는지 여부에 관계없이 /bar.php
경로는 항상에 매핑됩니다 http://example.com/bar.php
.
그러나 상대 경로가있는 다른 규칙은 규칙이있는 디렉토리를 기반으로합니다.
RewriteRule ^foo$ bar.php [L]
는 "루트"에 있고 당신은 가서 http://example.com/foo
서비스를받습니다 http://example.com/bar.php
. 그러나 해당 규칙이 "subdir1"디렉토리에 있고로 이동 http://example.com/subdir1/foo
하면 서비스가 제공 http://example.com/subdir1/bar.php
됩니다. 문서가 말했듯 이 상대 경로에 필요 하지만 대부분의 경우 작동하는 것처럼 보입니다. 리디렉션하는 경우를 제외하고 ( R
플래그를 사용하거나 http://host
규칙의 대상에 있기 때문에 암시 적으로 ) 이는이 규칙을 의미합니다.
RewriteRule ^foo$ bar.php [L,R]
그것이 "subdir2"디렉토리에 있고으로 이동하면 http://example.com/subdir2/foo
mod_rewrite는 상대 경로를 URL 경로 대신 파일 경로로 착각하고 R
플래그 때문에 다음과 같이 리디렉션됩니다 http://example.com/var/www/localhost/htdocs/subdir1
. 분명히 당신이 원하는 것이 아닙니다.
이것은 RewriteBase
지시문입니다. 지시문은 mod_rewrite에게 모든 상대 경로의 시작 부분에 추가 할 내용을 알려줍니다. 그래서 내가 가지고 있다면 :
RewriteBase /blah/
RewriteRule ^foo$ bar.php [L]
"subsubdir"에,에가는 http://example.com/subdir2/subsubdir/foo
실제로 나를 섬기는 것입니다 http://example.com/blah/bar.php
. "bar.php"가베이스의 끝에 추가됩니다. 실제로이 예제는 일반적으로 원하는 디렉토리가 아닙니다. 동일한 디렉토리 컨테이너 또는 htaccess 파일에 여러 개의베이스를 가질 수 없기 때문입니다.
대부분의 경우 다음과 같이 사용됩니다.
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
해당 규칙이 "subdir1"디렉토리에있는 위치
RewriteBase /subdir2/subsubdir/
RewriteRule ^foo$ bar.php [L]
"subsubdir"디렉토리에 있습니다.
이를 통해 규칙을 이식 가능하게 만들 수 있으므로 모든 디렉토리에 규칙을 삭제하고 규칙 대신 기본 만 변경하면됩니다. 예를 들어 다음과 같은 경우 :
RewriteEngine On
RewriteRule ^foo$ /subdir1/bar.php [L]
RewriteRule ^blah1$ /subdir1/blah.php?id=1 [L]
RewriteRule ^blah2$ /subdir1/blah2.php [L]
...
등으로가는 것이 http://example.com/subdir1/foo
될 것 http://example.com/subdir1/bar.php
등 그리고 당신은 "subsubdir"디렉토리에 해당 파일 및 모든 규칙을 이동하기로 결정 말한다. 대신 모든 인스턴스 변화의 /subdir1/
로를 /subdir2/subsubdir/
, 당신은 단지 기본 있었다 수 있습니다 :
RewriteEngine On
RewriteBase /subdir1/
RewriteRule ^foo$ bar.php [L]
RewriteRule ^blah1$ blah.php?id=1 [L]
RewriteRule ^blah2$ blah2.php [L]
...
그런 다음 해당 파일과 규칙을 다른 디렉토리로 이동해야 할 때 기본을 변경하십시오.
RewriteBase /subdir2/subsubdir/
그리고 그게 다야.