하나의 특정 경로를 제외한 모든 요청을 리디렉션하는 mod_rewrite 규칙
-
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