40

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 は無視されると思います。

4

1 に答える 1

48

HTTP_HOST には、要求された URL のパスではなく、ホスト名のみが含まれます。

RewriteCond %{REQUEST_URI} !^/audio

必要なものはすべて揃っているはずです。

さらに、以下を使用して書き換えエンジンからデバッグ情報を取得できます。これは、条件とルールがどのように一致しているかを確認するのに非常に役立ちます。

RewriteLog /path/to/log/file
RewriteLogLevel 3
于 2008-08-21T10:41:08.590 に答える