RewriteBase는 .htaccess에서 어떻게 작동합니까


227

나는 몇 가지 .htaccess예 에서 이것을 보았다

RewriteBase /

<base href="">HTML 과 기능면에서 다소 유사한 것으로 보입니다 .

나는 그것이 RewriteRule진술 의 시작 부분 (슬래시가없는 것)에 자동으로 가치를 부여 할 수 있다고 생각 합니까?

제대로 작동하지 못했습니다. 프로덕션 서버와 다른 개발 서버가 종종 있기 때문에 사이트 이식성에 매우 유용 할 수 있다고 생각합니다. 내 현재 방법은 내 RewriteRule진술에서 일부를 삭제 합니다.

누구든지 간단히 구현하는 방법을 설명해 줄 수 있습니까?

감사



RewriteBase는 디렉토리 또는 .htaccess 컨텍스트에서만 작동합니다. 제공된 @SalmanPK 링크에 대한 컨텍스트를 참조하십시오.
Eddie B

1
자세한 설명은이 답변을 참조하십시오. stackoverflow.com/a/2137593/292060
goodeye

1
이것은보다 심층적 인 답변입니다 : stackoverflow.com/a/21348047/632951
Pacerier

이것은 단선 답변입니다 : stackoverflow.com/a/46541685/632951
Pacerier

답변:


102

내 말로, 문서를 읽고 실험 한 후에 :

재 작성을위한 기반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매개 변수를.


10
“RewriteBase 매개 변수를 제거하십시오”-rewriteRule 매개 변수를 의미 했습니까? :)
Kissaki

1
나는 ReWriteBase이 htaccess로 모든 규칙을 설정 않습니다 .. htaccess로에 대한 몇 가지 세부 사항을 지우려면 다음과 같은 것을 선언? 설정을 해제하는 방법이 있습니까, 재설정 할 수 있습니까?
Damon

3
@Kissaki : 아니요, $1괄호로 묶은 RewriteRule 패턴과 일치하지만 대체의 상대 경로가 RewriteBase 매개 변수에서 나옵니다. 따라서 결과 치환은 /~new/$1/입니다.
MrWhite

3
@Damon : 여러 지시문 에 관한 이 질문을 보십시오 RewriteBase. 간단히 말해서, 둘 이상을 가질 수는 없습니다. 마지막 RewriteBase 지시어가 이기고 전체 .htaccess 파일에 영향을 미칩니다.
MrWhite

24
-1; 이 답변은 다른 사람들에게 도움이 된 것 같지만 완전히 불투명합니다. 나는 " RewriteBase다시 쓰기를위한 기반을 제공하는 데 사용할 수있다" 는 것을 짐작할 수있었습니다. 그것은 단어의 재배치에 불과합니다. 그러나이 문맥에서 "기본" 무엇인지, 그리고 그 의미 무엇인지 전혀 모릅니다 . 예를 들어 RewriteBase줄을 제거 하면 주어진 것 입니다. 수동 I의 이동 끄기 ...
마크 Amery

89

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 (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/

그리고 그게 다야.


나를 위해, 나는 놓쳤다 RewriteEngine On. 예를 들어 1and1이 필요하지 않지만 전용 서버에 필요합니다.
Portekoi

41

AFAIK, RewriteBase는 .htaccess사이트의 루트가 아닌 파일 에서 mod_rewrite가 실행되고 있고 실행중인 폴더의 파일 시스템 경로가 아닌 잘못된 웹 경로를 추측하는 경우에만 수정하는 데 사용됩니다 . 매핑 된 폴더의 .htaccess에있는 RewriteRule은 http://example.com/myfolder다음을 사용할 수 있습니다.

RewriteBase myfolder

mod_rewrite가 올바르게 작동하지 않는 경우

이 문제를 해결하기보다는 특이한 것을 달성하기 위해 그것을 사용하려고하면 매우 혼란스러워하는 레시피처럼 들립니다.


2
슬래시로 끝나야합니까?
Pacerier

@self, 아니오. 테스트 및 하위 설명 : stackoverflow.com/a/11443194/632951
Pacerier

23

RewriteBase는 사이트 루트에 .htaccess 만 넣을 수있는 상황에서만 유용합니다. 그렇지 않으면 사이트의 다른 디렉토리에 다른 .htaccess 파일을 배치하고 RewriteBase 지시문을 완전히 생략하는 것이 좋습니다.

최근에는 복잡한 사이트의 경우 테스트에서 파일을 한 단계 더 실행하기 위해 파일을 배포하기 때문에 파일을 가져 왔습니다.


22
이것이 좋은 조언이 될 수도 있지만, 이것은 전혀 질문에 대한 답변이 아닙니다. 따라서이 질문에 대한 의견이었고, 많은 투표를받지 않았으며“답변”으로 받아 들여지지 않았어야합니다.
사키

3
"다른 디렉토리에 다른 .htaccess 파일을 두는 것이 좋습니다"-이것이 좋은 조언인지 확실하지 않습니까? 사이트 전체에 .htaccess 파일이 점으로 표시되어 있으면 디버깅 / 유지 관리가 악몽이 될 수 있습니다. 귀하의 사이트 루트에 하나의 .htaccess 파일 이있는 것이 바람직 하다고 말했 을 것입니다.
MrWhite

1
@ w3d 타이밍 문제도있다 : 서브 디렉토리에 액세스 할 때마다 (루트에서 현재 서브 디렉토리까지) 여러 .htaccess 파일이 구문 분석된다. 규칙이 많이 포함되어 있어도 루트에있는 단일 파일과 달리 파일이 많으면 요청에 대한 전체 응답 속도가 느려질 수 있습니다.
Erenor Paz

19

개발할 때 폴더 내의 다른 도메인에 있습니다. 사이트를 실시간으로 가져 오면 해당 폴더가 더 이상 존재하지 않습니다. RewriteBase를 사용하면 두 환경에서 동일한 .htaccess 파일을 사용할 수 있습니다.

살 때 :

RewriteBase /
# RewriteBase /dev_folder/

개발할 때 :

# RewriteBase /
RewriteBase /dev_folder/

4
이것이 항상 작동하지는 않을 것이라고 확신합니다. 당신이 사용 된 경우 %{REQUEST_URI}A의 RewriteCond예를 들어 지시?
MrWhite

1
@ user1669830, 단 하나의 재 작성이있는 경우 재 작성에 기본을 추가 할 수 있습니다. stackoverflow.com/a/46541685/632951
Pacerier

18

내가 찾은 가장 명확한 설명은 현재 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 문서는 "내부 처리 단계에 대한 자세한 정보"를 제공합니다.

교훈 : "현재"에 익숙해 져야하지만 보석은 연대기에서 찾을 수 있습니다.


3

이 명령은 재 작성을위한 기본 URL을 명시 적으로 설정할 수 있습니다. 도메인의 루트에서 시작하려면 RewriteRule 앞에 다음 줄을 포함하십시오.

RewriteBase /

2

나는 아파치 문서에서 발췌 한이 이전 답변을 보완한다고 생각합니다.

이 지시문은 다음 조건 중 하나에 해당하지 않는 경우 디렉토리 별 (htaccess) 컨텍스트의 대체에서 상대 경로를 사용할 때 필요합니다.

  • 원래 요청 및 대체는 DocumentRoot 아래에 있습니다 (별칭과 같은 다른 방법으로는 도달 할 수 없음).

  • 상대 대체로 접미사가 붙은 RewriteRule을 포함하는 디렉토리의 파일 시스템 경로는 서버의 URL 경로로도 유효합니다 (드문 경우).

앞에서 언급했듯이 다른 상황에서는 규칙을 더 짧게 만드는 것이 유용합니다. 또한 앞에서 언급했듯이 htaccess 파일을 서브 디렉토리에 배치하여 동일한 결과를 얻을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.