Apache 重寫或代理到內部伺服器
首先,這是我第一次接觸 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
的,這應該可以解決問題!