RewriteBase는 .htaccess에서 어떻게 작동합니까?
나는 이것을 몇 가지 .htaccess예 에서 보았다
RewriteBase /
기능면 <base href="">에서 HTML 과 다소 유사한 것으로 보입니다 .
RewriteRule명령문 의 시작 부분에 자동으로 값을 추가 할 수 있다고 생각합니다 (슬래시가없는 경우도 있음)?
제대로 작동하지 못했습니다. 나는 종종 프로덕션 서버와 다른 개발 서버를 가지고 있기 때문에 사이트 이식성에 매우 유용하다고 생각합니다. 내 현재 방법은 내 RewriteRule진술에서 일부를 삭제 합니다.
누구든지 그것을 구현하는 방법을 간략하게 설명 할 수 있습니까?
감사
답변
내 말로, 문서를 읽고 실험 한 후 :
재 작성을위한 기반RewriteBase 을 제공하는 데 사용할 수 있습니다 . 이걸 고려하세요
# invoke rewrite engine
RewriteEngine On
RewriteBase /~new/
# add trailing slash if missing
rewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]
이것은 URL에 후행 슬래시가 있는지 확인하는 데 사용한 실제 규칙입니다. 이것은 변환됩니다
http://www.example.com/~new/page
...에
http://www.example.com/~new/page/
를 가짐으로써 RewriteBase거기, 당신은 상대 경로가 벗겨 질 수 있도록 RewriteBase매개 변수를.
RewriteBase에만 적용되는 대상 (A)의 상대 재기록 룰.
이와 같이 RewriteBase 사용 ...
RewriteBase /folder/ RewriteRule a\.html b.html본질적으로 동일합니다 ...
RewriteRule a\.html /folder/b.html그러나 .htaccess 파일이 내부에 있으면
/folder/동일한 대상을 가리 킵니다.RewriteRule a\.html b.html
문서는 항상를 사용한다는 것을 의미하지만 RewriteBaseApache는 일반적으로 다음이 아닌 한 DocumentRoot 아래의 경로에 대해 올바르게 감지합니다.
Alias지시문 을 사용하고 있습니다..htaccess 재 작성 규칙을 사용 하여 상대 URL 에 대한 HTTP 리디렉션 (자동 재 작성 아님)을 수행하고 있습니다.
이러한 경우 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(하위 디렉터리)
를 통해 전송되는 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/foomod_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/
그리고 그게 다야.
AFAIK, RewriteBase는 .htaccess사이트의 루트가 아닌 파일 에서 mod_rewrite가 실행되고있는 경우에만 사용되며 실행중인 폴더에 대해 잘못된 웹 경로 (파일 시스템 경로가 아님)를 추측합니다. http://example.com/myfolder다음을 사용할 수 있는 폴더의 .htaccess에있는 RewriteRule :
RewriteBase myfolder
mod_rewrite가 올바르게 작동하지 않는 경우.
이 문제를 해결하기보다는 특이한 것을 달성하기 위해 그것을 사용하려고 시도하는 것은 매우 혼란스러워하는 조리법처럼 들립니다.
RewriteBase는 사이트의 루트에 .htaccess 만 넣을 수있는 상황에서만 유용합니다. 그렇지 않으면 사이트의 다른 디렉토리에 다른 .htaccess 파일을 배치하고 RewriteBase 지시문을 완전히 생략하는 것이 더 나을 수 있습니다.
최근에 복잡한 사이트의 경우 테스트에서 파일을 배포하여 한 단계 만 더 복잡하게 만들기 때문에 제거했습니다.
개발할 때 폴더 내의 다른 도메인에 있습니다. 사이트를 활성화하면 해당 폴더가 더 이상 존재하지 않습니다. RewriteBase를 사용하면 두 환경에서 동일한 .htaccess 파일을 사용할 수 있습니다.
라이브 :
RewriteBase /
# RewriteBase /dev_folder/
개발할 때 :
# RewriteBase /
RewriteBase /dev_folder/
내가 찾은 가장 명확한 설명은 현재 2.4 아파치 문서가 아니라 버전 2.0 입니다.
# /abc/def/.htaccess -- per-dir config file for directory /abc/def
# Remember: /abc/def is the physical path of /xyz, i.e., the server
# has a 'Alias /xyz /abc/def' directive e.g.
RewriteEngine On
# let the server know that we were reached via /xyz and not
# via the physical path prefix /abc/def
RewriteBase /xyz
어떻게 작동합니까? 아파치 해커에게이 2.0 문서는 "내부 처리 단계에 대한 자세한 정보"를 제공합니다.
교훈 : "현재"에 대해 잘 알고 있어야하지만 연대기에서 보석을 찾을 수 있습니다.
이 명령은 재 작성을위한 기본 URL을 명시 적으로 설정할 수 있습니다. 도메인의 루트에서 시작하려면 RewriteRule 앞에 다음 줄을 포함합니다.
RewriteBase /
나는 Apache 문서에서 발췌 한이 이전 답변을 잘 보완한다고 생각합니다.
이 지시문은 다음 조건 중 하나에 해당하지 않는 한 디렉토리 별 (htaccess) 컨텍스트에서 대체에서 상대 경로를 사용할 때 필요합니다.
원래 요청과 대체는 DocumentRoot 아래에 있습니다 (별칭과 같은 다른 방법으로 연결할 수있는 것과 반대).
상대 대체로 접미사가 붙은 RewriteRule이 포함 된 디렉토리의 파일 시스템 경로는 서버의 URL 경로로도 유효합니다 (드물게 발생 함).
앞서 언급했듯이 다른 컨텍스트에서는 규칙을 더 짧게 만드는 것이 유용합니다. 또한 앞서 언급했듯이 하위 디렉토리에 htaccess 파일을 배치하여 동일한 작업을 수행 할 수 있습니다.