하나의 특정 경로를 제외한 모든 요청을 리디렉션하는 mod_rewrite 규칙


39

Apache 2.2 VirtualHost 선언에서 mod_rewrite를 사용하여 내 도메인에 대한 모든 요청을 다른 도메인으로 리디렉션하려고합니다. 한 가지 예외가 있습니다. /audio 경로 에 대한 모든 요청을이 아닌 리디렉션하고 싶습니다.

이 작업을 수행하기 위해 RewriteCond 및 RewriteRule을 작성했으나 적절하지 않으며 그 이유를 알 수 없습니다. 정규식에 "/ audio"문자열에 대한 부정적 예측이 포함되어 있지만 어떤 이유로이 일치하지 않습니다. 내가으로한다 RewriteCond를 변경하는 경우

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC] 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 

:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC] 

(즉이 부정적 예측 부분의 외부 슬래시를 넣어) 그것은 작동하지만, 이것의 단점은 요청한다는 것입니다 여기에 정의이다 후행 슬래시가없는 mydomain.net은 리디렉션되지 않습니다.

누구든지 내가 잘못하고있는 것을 지적 할 수 있습니까?

(참고 :! 위 StackOverflow.com 추가되고있는 RewriteRule의 비트의 도메인 주위에 꺾쇠 괄호 - 그들이 실제 코드에없는있다) 여기


이 규칙은 다음과 같습니다

<VirtualHost *:80> 
ServerAdmin [email protected] 
DocumentRoot "/var/www/mydomain.net/htdocs" 
ServerName www.mydomain.net 
ServerAlias mydomain.net 

RewriteEngine on 
RewriteCond {REQUEST_URI} !^/audio 
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301] 
RewriteLog logs/mod_rewrite_log 
RewriteLogLevel 3 

ErrorLog logs/error_log 
CustomLog logs/access_log common 
</VirtualHost> 

덕분에 @mercutio - 완벽한 이해를 만드는하지만 여전히 작동하지 않습니다. REQUEST_URI가 /audio 시작 않기 때문에 나는 RewriteRule의 무시 기대

(2) init rewrite engine with requested uri /audio/something.mp3 
(3) applying pattern '^(.*)$' to uri '/audio' 
(2) rewrite '/audio' -> 'http://www.newdomain.net/' 
(2) explicitly forcing redirect with http://www.newdomain.net 
(1) escaping http://www.newdomain.net for redirect 
(1) redirect to http://www.newdomain.net [REDIRECT/301] 

: 나는 http://mydomain.net/audio/something.mp3에 요청을 할 때

다음은 mod_rewrite는 로그의 말씀입니다.

  0

패턴을 적용 uri '/ audio'다른 패턴을 처리하는 것처럼 들립니다. 아니면 논리가 지금 막 돌아 왔습니다. 전체 규칙을 게시 할 수 있습니까? 21 aug. 082008-08-21 09:33:59

47

HTTP_HOST에는 요청 된 URL 경로가 아닌 호스트 이름 만 포함됩니다.

RewriteCond %{REQUEST_URI} !^/audio 

필요한 항목 만 있으면됩니다.

또한, 당신은 당신의 조건과 규칙이 일치되는 방식을 볼 수 정말 유용 다음과 재 작성 엔진에서 디버그 정보를 얻을 수 있습니다 : '(. *)^$'

RewriteLog /path/to/log/file 
RewriteLogLevel 3 
  0

다른 답변을 추가하는 대신 답변을 수정해야합니다. 05 jun. 122012-06-05 00:46:00

  0

업데이트 : RewriteCond가 여전히 올바르지 만 apache 버전이 2.4 이상이면 RewriteLog가 더 이상 작동하지 않습니다. 'LogLevel rewrite : trace3'을 사용하여 Loglevel을 mod_rewrite에 맞게 설정할 수 있지만 출력을 위해 ErrorLog를 감시해야합니다. 07 dec. 172017-12-07 13:28:38