15

가상 도메인 시스템에서 일하고 있습니다. 와일드 카드 DNS를 *.loc으로 설정하고 내 .htaccess 파일에서 작업을 시도하고 있습니다. 다음 코드는 작동합니다. 나는 이것이 내가 넣어 아무것도 작업 할,% N 역 참조 내부 RewriteCond

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC] 
RewriteCond %{REQUEST_URI} !^/example/ 
RewriteRule (.*) /example/$1 [L,QSA] 

을하지만 그러나, 나는 도메인으로 발견 된 텍스트에 대해 체크 %{REQUEST_URI}이 필요합니다.

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC] 
RewriteCond %{REQUEST_URI} !^/%3/ 
RewriteRule (.*) /%3/$1 [L,QSA] 

그러나 내부 서버 오류 통해 내 코드를 일으키는 RewriteCond %{REQUEST_URI} !^/%3/ 라인 :이 코드를 사용하여 시도했다. 나는 이것이 내 코드의 % N 때문인 것으로 알고 있지만, 내가 그것으로 작업 할 수있는 방법이 있습니까? 이 줄이 필요합니다. 그렇지 않으면 내 코드가 내부 리디렉션에서 실패합니다.

누군가에게 도움이되기를 바랍니다. 필요한 것은 다음 RewriteCond에서 RewriteCond를 역 참조 할 수 있어야합니다.

답변

38

여기서 잘못된 점은 두 가지입니다.

먼저 %{HTTP_HOST} 정규식이 좋지 않습니다. . 개의 점을 이스케이프 처리해야합니다. 그렇지 않으면 "개행 문자가 아닌 문자"로 처리됩니다. 이것은 본질적으로 %3 역 참조를 TLD 앞에 호스트 이름의 마지막 문자로 만듭니다 (예 : http://blah.bar.loc, % 3 = r).

두 번째로, 왼쪽 문자열 인 RewriteCond의 정규식에서 역 참조를 사용할 수 없습니다. 이상한 제한 사항입니다. 그러나 정규식에서 \1 참조를 사용할 수 있으므로 일치시킬 왼쪽 영 문자열을 영리하게 만들 수 있습니다. %3::%{REQUEST_URI}과 같은 것을 입력하면 다음과 같이 일치시킬 수 있습니다 : !^(.*?)::/\1/?. 이 정규식은 본질적으로 말한다 : "일치와 그룹 텍스트 의 첫 번째 블록을::하기 전에, 다음 /(first block):: 시작 다음과 같은 텍스트의 확인 블록을".

그래서 규칙은 다음과 같아야합니다

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC] 
RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/? 
RewriteRule (.*) /%3/$1 [L,QSA] 
+0

건배! 그 라인이 실제로하는 일이 무엇인지 모르겠지만 작동합니다. 당장은 저도 만족합니다. 귀하의 도움은 대단히 감사합니다 :) –

+1

지구상의 어디에 문서화되어 있습니다. 이 답변은 너무 많은 투표를받을 자격이 있습니다. 나는 우리가 대답을 받아들이지 않고, 현상금을 걸고, 재 승인한다고 투표한다. –

+0

매우 영리합니다! 감사합니다 =) – gobwas