Apache 2.2 VirtualHost 宣言で mod_rewrite を使用して、自分のドメインへのすべてのリクエストを別のドメインにリダイレクトしようとしています。これには例外が 1 つあります。/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 - それは完全に理にかなっていますが、それでもうまくいかないようです。
http://mydomain.net/audio/something.mp3にリクエストしたときの mod_rewrite ログの内容は次のとおりです。
(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 は無視されると思います。