我无法弄清楚如何添加基本 HTTP 身份验证来为在生产 Web 服务器上运行的开发测试环境提供密码保护。主站点和测试环境都是使用 AJP 代理来为 Tomcat Web 应用程序的单独实例提供服务的虚拟主机。我们需要防止公众在不对 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如下:
<IfModule mod_ssl.c>
<VirtualHost dev.mydomain.com:80443>
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/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/dev/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
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/apache2/error.log
LogLevel info
CustomLog /var/log/apache2/ssl_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>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
SSLCACertificateFile /etc/ssl/certs/intermediate.crt
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
</IfModule>
据记录,涉及以下版本:Apache:2.2.14 / Tomcat:7.0.23 / Java:SE 1.6.0_26-b03 / OS:Ubuntu 10.04 LTS
答案1
正如您所发现的,这些<Directory>
阻止不适用,因为您正在从代理服务器而不是本地目录提供内容。
不妨尝试<Location>
一下。
<Location />
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
</Location>