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]。如果我删除有问题的规则,反向代理可以正常工作。不幸的是我需要保留它。

如何告诉apacheProxyPass首先使用规则,RewriteRule只有在没有匹配的情况下才使用?

答案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]

但不会触发 catch all 重写规则。

答案2

RewriteCond在您的问题中添加一个RewriteRule以排除访问以下路径中使用的路径的情况ProxyPass

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

因此,您的“有问题”RewriteRule将不会匹配任何以“/mediaproxy”开头的 URL。

相关内容