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

StackOverflow https://stackoverflow.com/questions/19493

  •  09-06-2019
  •  | 
  •  

문제

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

이 작업을 수행하기 위해 RewriteCond 및 RewriteRule을 작성했지만 올바르지 않으며 이유를 알 수 없습니다.정규 표현식에는 "/audio" 문자열에 대한 부정 예측이 포함되어 있지만 어떤 이유로 이는 일치하지 않습니다.정의는 다음과 같습니다.

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

RewriteCond를 다음과 같이 변경하면:

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

(즉.슬래시를 부정 예측 부분 바깥에 두면 작동하지만, 후행 슬래시가 없는 mydomain.net에 대한 요청은 리디렉션되지 않는다는 단점이 있습니다.

누구든지 내가 뭘 잘못하고 있는지 지적할 수 있나요?

(메모:위의 RewriteRule 비트에서 도메인 주위의 꺾쇠 괄호는 StackOverflow.com에 의해 추가된 것입니다. 실제 코드에는 없습니다!)


규칙은 다음과 같습니다.

<VirtualHost *:80>
ServerAdmin me@mydomain.net
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에게 감사드립니다. 완벽하게 이해되지만 여전히 작동하지 않는 것 같습니다.

내가 요청할 때 mod_rewrite 로그에 기록되는 내용은 다음과 같습니다. http://mydomain.net/audio/something.mp3:

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

REQUEST_URI는 다음으로 시작하므로 /audio RewriteRule이 무시될 것으로 예상합니다.

도움이 되었습니까?

해결책

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

RewriteCond %{REQUEST_URI} !^/audio

필요한 전부여야 합니다.

또한 다음을 사용하여 재작성 엔진에서 디버그 정보를 얻을 수 있는데, 이는 조건과 규칙이 어떻게 일치하는지 확인하는 데 매우 유용합니다.

RewriteLog /path/to/log/file
RewriteLogLevel 3
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top