RewriteRuleがProxyPassをオーバーライドする

RewriteRuleがProxyPassをオーバーライドする

Centos 7システムでApacheサーバーの隣にPythonサーバーを実行したいと思います。最も簡単な方法は、Apacheをリバースプロキシとして設定することです。これは私の仮想ホスト構成です。

<VirtualHost *:443>
        DocumentRoot /home/username/mydomain/src
        ServerName mydomain.com
        ErrorLog logs/mydomain-error_log
        CustomLog logs/mydomain-access_log common
        DirectoryIndex index.php

    <Directory /home/username/mydomain/src>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
        AddOutputFilterByType DEFLATE text/html text/plain text/xml
    </Directory>


    ProxyPreserveHost On
    ProxyPass /mediaproxy http://127.0.0.1:9001/mediaproxy
    ProxyPassReverse /mediaproxy http://127.0.0.1:9001/mediaproxy

    LogLevel alert rewrite:trace6
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^/api/media/(.*) /data/$1 [L]
    RewriteRule ^/api/v1/* /api/v1/index.php [L]
    RewriteRule ^/assets/(.*) /site/v1/content/assets/$1 [L]
    RewriteRule ^/css/(.*) /site/v1/content/css/$1 [L]
    RewriteRule ^/js/(.*) /site/v1/content/js/$1 [L]
    RewriteRule ^/fonts/(.*) /site/v1/content/fonts/$1 [L]
    RewriteRule ^/* /index.php [L] # problematic rule

    // lets encrypt entries

今私の問題は、書き換えルールがProxyPassよりも優先されるということです。 mydomain.com/mediaproxy/somepageにアクセスすると、/index.phpからコンテンツを提供しますRewriteRule ^/* /index.php [L]。問題のルールを削除すると、リバースプロキシが正しく機能します。残念ながら保管する必要があります。

ProxyPassルールを最初に使用し、RewriteRule一致がない場合にのみApacheに指示するにはどうすればよいですか?

答え1

調べました。書き換えルールに[P]を追加すると、リバースプロキシロールが起動します。

ProxyPass /mediaproxy http://127.0.0.1:9001/mediaproxy
ProxyPassReverse /mediaproxy http://127.0.0.1:9001/mediaproxy

機能的には次のとおりです。

RewriteRule /mediaproxy http://127.0.0.1:9001/mediaproxy [P]

ただし、すべて書き換えルールのキャッチは実行されません。

答え2

RewriteCondRewriteRule以下で使用されるパスへのアクセスを除外するには、質問に1つを追加しますProxyPass

RewriteCond "%{REQUEST_URI}" !^/mediaproxy.*
RewriteRule ^/.* /index.php [L]

したがって、「問題」は、RewriteRule「/mediaproxy」で始まるURLと一致しません。

関連情報