特定の1つのパスを除くすべてのリクエストをリダイレクトするmod_rewriteルール


39

Apache 2.2 VirtualHost宣言でmod_rewriteを使用して、自分のドメインへのすべてのリクエストを別のドメインにリダイレクトしようとしています。これには例外が1つあります。/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にはリダイレクトされません。

誰かが間違っていることを指摘できますか?

(注:上記のRewriteRuleビットにおけるドメインの周りに角括弧はStackOverflow.comによって追加されている - それらが実際のコードでは存在しない)ここ


ルールは以下のとおり

<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 8月. 082008-08-21 09:33:59

47

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

RewriteCond %{REQUEST_URI} !^/audio 

必要があります。

さらに、あなたはあなたの条件とルールが一致しているかを確認するために非常に便利であるとして、次のと書き換えエンジンからデバッグ情報を取得することができます:「(。*)^ $」

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

別の回答を追加するのではなく、あなたの回答を編集したはずです。 05 6月. 122012-06-05 00:46:00

  0

更新:RewriteCondはまだ正しいですが、Apacheのバージョンが2.4以上であれば、RewriteLogは動作しなくなりました。 'LogLevel rewrite:trace3'を使用してmod_rewrite固有のLoglevelを設定できますが、出力のためにErrorLogを監視する必要があります。 07 12月. 172017-12-07 13:28:38