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
RewriteCond
RewriteRule
以下で使用されるパスへのアクセスを除外するには、質問に1つを追加しますProxyPass
。
RewriteCond "%{REQUEST_URI}" !^/mediaproxy.*
RewriteRule ^/.* /index.php [L]
したがって、「問題」は、RewriteRule
「/mediaproxy」で始まるURLと一致しません。