Apache-2.2

如何使用基本身份驗證保護在 Apache2 虛擬主機中反向代理的 Tomcat webapp?

  • January 23, 2012

我無法弄清楚如何添加基本 HTTP 身份驗證來密碼保護在生產 Web 伺服器上執行的開發測試環境。主站點和測試環境都是虛擬主機,它們使用 AJP 代理來提供單獨的 Tomcat webapp 實例。我們需要防止公眾在不更改 Tomcat 環境中的 web.xml 的情況下訪問測試環境,必須使用 Apache 而不是 Tomcat 來實現保護。但是,虛擬主機中的 ProxyPass 和 ProxyPassReverse 指令似乎覆蓋了對 .htaccess 或我放在 <Directory> 控制塊中的任何內容的使用,而我似乎無法在 <VirtualHost> 控制項的主體中使用像 AuthType 這樣的指令擋在旁邊。一世’ 我對 Apache(或 Tomcat)不是很有經驗,並且不確定哪些指令可以應用在哪里以及哪些可能會覆蓋其他指令。因為需要在生產伺服器上進行更改,所以我不能輕易進行實驗,以免造成停機。

httpd.conf 本身非常簡單:

LoadModule  proxy_http_module   /usr/lib/apache2/modules/mod_proxy_http.so
LoadModule  headers_module      /usr/lib/apache2/modules/mod_headers.so

LoadFile    /usr/lib/libxml2.so

相關的虛擬主機文件 /etc/apache2/sites-available/dev443 如下:

&lt;IfModule mod_ssl.c&gt;
&lt;VirtualHost dev.mydomain.com:80443&gt;
   ServerName  dev.mydomain.com:80443
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www/dev

   ProxyPass / ajp://127.0.0.1:8010/
   ProxyPassReverse / ajp://127.0.0.1:8010/

   &lt;Directory /&gt;
       Options FollowSymLinks
       AllowOverride None
   &lt;/Directory&gt;
   &lt;Directory /var/www/dev/&gt;
       Options Indexes FollowSymLinks MultiViews
       AllowOverride All 
       Order allow,deny
       allow from all
   &lt;/Directory&gt;

   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   &lt;Directory "/usr/lib/cgi-bin"&gt;
       AllowOverride None
       Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
       Order allow,deny
       Allow from all
   &lt;/Directory&gt;

   ErrorLog /var/log/apache2/error.log

   LogLevel info

   CustomLog /var/log/apache2/ssl_access.log combined

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

   SSLEngine on

   SSLCertificateFile    /etc/ssl/certs/server.crt
   SSLCertificateKeyFile /etc/ssl/private/server.key
   SSLCACertificateFile  /etc/ssl/certs/intermediate.crt

   &lt;FilesMatch "\.(cgi|shtml|phtml|php)$"&gt;
       SSLOptions +StdEnvVars
   &lt;/FilesMatch&gt;
   &lt;Directory /usr/lib/cgi-bin&gt;
       SSLOptions +StdEnvVars
   &lt;/Directory&gt;

   BrowserMatch "MSIE [2-6]" \
       nokeepalive ssl-unclean-shutdown \
       downgrade-1.0 force-response-1.0
   BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

&lt;/VirtualHost&gt;
&lt;/IfModule&gt;

作為記錄,涉及以下版本:Apache:2.2.14 / Tomcat:7.0.23 / Java:SE 1.6.0_26-b03 / OS:Ubuntu 10.04 LTS

正如您所發現的,這些&lt;Directory&gt;塊不適用,因為您從代理伺服器而不是本地目錄提供內容。

試試&lt;Location&gt;吧。

&lt;Location /&gt;
   ProxyPass ajp://127.0.0.1:8010/
   ProxyPassReverse ajp://127.0.0.1:8010/
   AuthType Basic
   AuthName "something"
   AuthUserFile /path/to/htpasswd
   Require valid-user
&lt;/Location&gt;

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