Apache-2.2

帶有 mod_rewrite 的特定虛擬主機的 ProxyPass

  • November 8, 2013

我有一個 Web 伺服器,它設置為動態地為不同域提供不同的文件根

<VirtualHost *:80>
   <IfModule mod_rewrite.c>
       # Stage sites :: www.[document root].server.company.com => /home/www/[document root]
       RewriteCond   %{HTTP_HOST}          ^www\.[^.]+\.server\.company\.com$
       RewriteRule   ^(.+)                 %{HTTP_HOST}$1          [C]
       RewriteRule   ^www\.([^.]+)\.server\.company\.com(.*) /home/www/$1/$2  [L]
   </IfModule>
</VirtualHost>

這使得它將www.foo.server.company.com服務於文件根目錄server.company.com:/home/www/foo/

對於其中一個站點,我需要添加一個ProxyPass,但我只希望它應用於那個站點。我嘗試了類似的東西

<VirtualHost *:80>
   <Directory /home/www/foo>
       UseCanonicalName Off
       ProxyPreserveHost On
       ProxyRequests Off
       ProxyPass /services http://www-test.foo.com/services
       ProxyPassReverse /services http://www-test.foo.com/services
   </Directory>
</VirtualHost>

但後來我得到了這些錯誤

此處不允許使用 ProxyPreserveHost

ProxyPass|ProxyPassMatch 在位置中定義時不能有路徑。

如何ProxyPass為單個虛擬主機設置一個?

只需將它ProxyPass移出<Directory>塊 - 如果它在那個上下文中,它應該適用於那個確切的上下文(而不是/services你希望它申請的那個)。

實際上,你根本沒有對那個塊做任何事情,看起來像?

<VirtualHost *:80>
   UseCanonicalName Off
   ProxyPreserveHost On
   ProxyRequests Off
   ProxyPass /services http://www-test.foo.com/services
   ProxyPassReverse /services http://www-test.foo.com/services
   # and if you do need to serve from /home/www/foo...
   DocumentRoot /home/www/foo
   <Directory /home/www/foo>
       Order allow,deny
       Allow from all
   </Directory>
</VirtualHost>

**編輯:**錯過了它實際上不是虛擬主機-您的範例只是虛擬主機塊中的一個目錄,這使我認為它們是分開的。

在這種情況下…

ProxyPreserveHost On
# If it's not already:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.foo
RewriteRule ^/services(.*) http://www-test.foo.com/services$1 [P,L]
ProxyPassReverse /services http://www-test.foo.com/services

引用自:https://serverfault.com/questions/551270