我有以下设置,用于自动生成在 /etc/apache2/apache2.conf 中配置的子域/虚拟文档根目录(在 Debian 7.0 上运行)
<VirtualHost *:80>
ServerAlias *
UseCanonicalName Off
VirtualDocumentRoot /home/%2/htdocs/%1
# Setup correct (virtual) document root as $_SERVER['DOCUMENT_ROOT'] for PHP
php_admin_value auto_prepend_file /home/jbraun/setdocroot.php
<Directory /home/%2/htdocs/%1>
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
DirectoryIndex index.html index.php
# These lines don't work
AuthType Basic
AuthName "HALMA"
AuthUserFile /usr/local/apache/passwd/passwords
Require valid-user
# Commented for testing purposes only
# Allow from halma.lan
# Satisfy any
</Directory>
CustomLog ${APACHE_LOG_DIR}/vhost_access.log combined
什么在起作用以及它的意义是什么
上述配置允许用户在其/home/username/htdocs/
目录下创建子目录,并通过动态生成的子域在浏览器中访问它们,例如,文件夹/home/jbraun/htdocs/project
将可在http://project.jbraun.halma.lan
(其中halma.lan
是本地内联网名称,相应的 DNS 已设置并正在运行) 访问。此外,整个故事都可以通过 DynDNS 服务在与project.jbraun.foobar.dyndns.org
外界类似的 URL 上访问。
我想要实现但未实现的目标
我希望从本地网络(halma.lan
或比方说192.168.2.*
)进行访问时不受密码保护,而通过 DynDNS URL(project.jbraun.foobar.dyndns.org
)从 WAN 进行的访问应该受到密码保护。
因此我按照 Apache 文档添加了“Auth*”行
AuthType Basic
AuthName "HALMA"
AuthUserFile /usr/local/apache/passwd/passwords
Require valid-user
但不幸的是,什么也没发生(是的,在此期间我重启了 apache)。服务器的错误日志文件也没有动静。
当我在我的某些项目的 .htaccess 文件中添加相同的行时,一切都按预期工作,因此我认为配置中的 VirtualDocumentRoot 和/或动态生成的文件路径一定存在一些问题。
有人可以给我指出正确的方向吗,我该如何实现这一点,或者是否有可能实现这一点?
提前致谢。
* [编辑] *
我想发布最终有效的配置,仅供参考和其他搜索此问题的人使用:
<VirtualHost *:80>
ServerAlias *.*.halma.lan
ServerAlias *.*.foobar.dyndns.org
UseCanonicalName Off
VirtualDocumentRoot /home/%2/htdocs/%1
# Setup correct (virtual) document root as $_SERVER['DOCUMENT_ROOT'] for PHP
php_admin_value auto_prepend_file /home/jbraun/setdocroot.php
#<Directory /home/%2/htdocs/%1>
<Directory ~ "^/home/.*/htdocs/.*/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Order allow,deny
DirectoryIndex index.html index.php
AuthType Basic
AuthName "HALMA"
AuthUserFile /usr/local/apache/passwd/passwords
Require valid-user
Allow from 10.0.0
Satisfy Any
</Directory>
CustomLog ${APACHE_LOG_DIR}/vhost_access.log combined
</VirtualHost>
感谢 HBruijn
答案1
我认为可以肯定地说,%1
扩张%2
只会发生在少数mod_vhost_alias支持这种魔法的指令。
Location
这可能是一个稍微不太安全的指令可以用来包含身份验证指令的例子,即
<Location />
AuthType Basic
AuthName "HALMA"
AuthUserFile /usr/local/apache/passwd/passwords
Require valid-user
</Location>
或者,目录指令还可以包含正则表达式,允许类似以下操作:
<Directory ~ "^/home/.*/htdocs/.*/">
</Directory>
您可以通过添加符合用户名命名约定的正则表达式来改进它,例如"^/home/([a-z_][a-z0-9_]{0,30})/htdocs/.*/"