Apache-2.2

Apache 重寫或代理到內部伺服器

  • August 3, 2012

首先,這是我第一次接觸 apache,所以請原諒我的初心 :)

我的基本設置是這樣的: mysub.domain.com通過 Godaddy 的 DNS 管理器的 CNAME 條目發送到我的靜態 IP。它命中了我執行 Apache2 的 Ubuntu 10 LTS 伺服器。

我有一個虛擬主機條目,可將該請求定向到正確的/var/www/mysub文件夾。我那裡沒有任何內容,但我在“It Works”頁面上添加了一行,這樣我就知道我是否成功到達那裡。我還有一台 Mac Mini,在與 Ubuntu 伺服器相同的本地網路上執行 wiki 伺服器。

我想mysub.domain.com點擊我的迷你伺服器而不是/var/www/mysub文件夾。

在這個網站和其他網站上大量閱讀之後,我設法做到了……有點。

我的 中有以下內容,/var/www/mysub/.htacess我在另一個 SF 問題中找到了這些內容(忘記複製連結)。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^mysub.domain.com/*
RewriteRule .* http://192.168.x.x/ [P,L]

這是因為它確實重定向mysub.domain.com到 Mini 的首頁。但是,當然,每個後續連結都會點擊 Mini 頁面。我想我理解它為什麼這樣做(任何以開頭的內容mysub.domain.com都指向本質上是 wiki 伺服器的首頁,並且由於 wiki 伺服器上的後續連結也包括mysub.domain.com,所以它總是在同一個地方結束)

我只是不知道該怎麼做。老實說,我實際上並不了解那些 Rewrite 行的語法。


我已經看過無數的配置條目範例並嘗試了其中的一些,但在沒有真正理解語法的情況下,這有點像在黑暗中拍攝。

是一篇有用的文章,在閱讀了這個問題後,我嘗試將其添加到我的/apache2/httpd.conf文件中

<Location />
  ProxyPass http://192.168.x.x
  ProxyPassReverse http://192.168.x.x
</Location>

沒運氣。

顯然,我有一些學習要做,但在我看來,我想做的事情可能很簡單。我錯過了什麼?


編輯評論

我的/etc/apache2/httpd.conf檔案

ServerName localhost

<VirtualHost *:80>
  ServerName domain.com
  ServerAlias www.domain.com
  DocumentRoot /var/www/domain
</VirtualHost>

<VirtualHost *:80>
  ServerName mysub.domain.com
  DocumentRoot /var/www/mysub
  <Location />
     ProxyPass http://192.168.x.x/
     ProxyPassReverse http://192.168.x.x/
  </Location>
</VirtualHost>

…和我的sites-available/mysub檔案…

<VirtualHost *:80>
       ServerAdmin me@domain.com
       ServerName mysub.domain.com
       DocumentRoot /var/www/mysub

       #ProxyRequests Off
       <Location />
               ProxyPass http://192.168.1.50/
               ProxyPassReverse http://192.168.1.50/
       </Location>
       <Directory />
               Options FollowSymLinks
               AllowOverride None
       </Directory>
       <Directory /var/www/mysub>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride None
               Order allow,deny
               allow from all
       </Directory>

       ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
       <Directory "/usr/lib/cgi-bin">
               AllowOverride None
               Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
               Order allow,deny
               Allow from all
       </Directory>

       ErrorLog /var/log/www/mysub/error.log

       # Possible values include: debug, info, notice, warn, error, crit,
       # alert, emerg.
       LogLevel warn

       CustomLog /var/log/apache2/access.log combined

   Alias /doc/ "/usr/share/doc/"
   <Directory "/usr/share/doc/">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride None
       Order deny,allow
       Deny from all
       Allow from 127.0.0.0/255.0.0.0 ::1/128
   </Directory>

的輸出apache2ctl -S

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
        default server 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1)
        port 80 namevhost 66-152-109-110.tvc-ip.com (/etc/apache2/sites-enabled/000-default:1)
        port 80 namevhost domain.com (/etc/apache2/sites-enabled/domain:1)
        port 80 namevhost mysub.domain.com (/etc/apache2/sites-enabled/mysub:1)
Syntax OK

你很親近!

幾點注意事項:

  • RewriteCond %{HTTP_HOST} ^mysub.domain.com/*-HTTP_HOST變數僅包含mysub.domain.com,而不包含路徑的其餘部分。

該規則實際上匹配,但意外 - 那裡沒有/字元,但*修飾符適用於/字元,意思是“重複/0 到無限次”。

Apache 使用與 perl 兼容的正則表達式 - 為了匹配確切的主機,它應該如下所示:

RewriteCond %{HTTP_HOST} ^mysub\.domain\.com$
  • RewriteRule .* http://192.168.x.x/ [P,L]- 這只是載入首頁,因為它不包括傳遞路徑的其餘部分 - 這必須在[P]使用RewriteRule.

這應該有效:

RewriteRule (.*) http://192.168.x.x/$1 [P,L]
  • ProxyPass設置幾乎是正確的,除了它被文件中的設置覆蓋,.htaccess所以它沒有被使用。使用.htaccess對性能不利,並且可能對安全性造成問題 - 請參閱此處的 Apache 文件中的建議。

.htaccess可能最好的方法是徹底刪除文件,然後使用ProxyPass. 稍微修改一下配置…

<Location />
  ProxyPass http://192.168.x.x/
  ProxyPassReverse http://192.168.x.x/
</Location>

…並將其從您的httpd.conf上方移動到<VirtualHost>為子域提供服務的塊內。

有了匹配的斜杠,沒有更多.htaccess的,這應該可以解決問題!

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