我在 Windows 上运行本地服务器,我想在定义变量时提供对服务器特定部分的 LAN 访问权限。它运行正常,只是服务于主配置而不是虚拟主机。
我特意让虚拟主机指向一个带有错误的禁止目录,DirectoryIndex
以确保它确实有效,但无论我做什么,页面始终正确提供。这是虚拟主机:
<VirtualHost ${LANIP}:${PORT}>
DocumentRoot ${SRVROOT}/htdocs/phpinfo
ServerName ${LANIP}:${PORT}
DirectoryIndex index.pl
</VirtualHost>
这是完成httpd.conf,删除了评论。
当我使用时httpd -DLANACCESS -S
,这是输出:
c:\fauna\apache\bin>httpd -DLANACCESS -S
VirtualHost configuration:
192.168.1.6:80 192.168.1.6 (C:/fauna/apache/conf/httpd.conf:464)
ServerRoot: "c:/fauna/apache"
Main DocumentRoot: "C:/fauna/apache/htdocs"
Main ErrorLog: "c:/fauna/apache/logs/error.log"
Mutex rewrite-map: using_defaults
Mutex lua-ivm-shm: using_defaults
Mutex default: dir="C:/fauna/apache/logs/" mechanism=default
PidFile: "c:/fauna/apache/logs/httpd.pid"
Define: LANACCESS
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
Define: FAUNAROOT=/fauna
Define: WIN_FAUNAROOT=C:\fauna
Define: SRVROOT=/fauna/apache
Define: WIN_SRVROOT=C:\fauna\apache
Define: PERLPATH=C:\fauna\perl
Define: WIN_PERLPATH=C:\fauna\perl
Define: LANIP=192.168.1.6
Define: PORT=80
我认为这表明 Apache 正确地识别出存在指令VirtualHost
,但忽略了其中的所有内容,或者不知何故它不匹配。无论如何,如果我localhost
从服务器或192.168.1.6
局域网上的另一台机器访问,它都会提供相同的页面。它尊重权限,但从局域网来看,它应该会中断并给出 404 的测试配置,而不是为主站点提供服务。
我甚至尝试覆盖默认的虚拟主机:
<VirtualHost _default_>
DocumentRoot ${SRVROOT}/htdocs/nothing
ServerName localhost:80
</VirtualHost>
Apache 的输出如下:
c:\fauna\apache\bin>httpd -DLANACCESS -S
AH00112: Warning: DocumentRoot [c:/fauna/apache/htdocs/nothing] does not exist
VirtualHost configuration:
192.168.1.6:80 192.168.1.6 (C:/fauna/apache/conf/httpd.conf:464)
*:80 localhost (C:/fauna/apache/conf/httpd.conf:474)
ServerRoot: "c:/fauna/apache"
Main DocumentRoot: "C:/fauna/apache/htdocs"
Main ErrorLog: "c:/fauna/apache/logs/error.log"
Mutex rewrite-map: using_defaults
Mutex lua-ivm-shm: using_defaults
Mutex default: dir="C:/fauna/apache/logs/" mechanism=default
PidFile: "c:/fauna/apache/logs/httpd.pid"
Define: LANACCESS
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
Define: FAUNAROOT=/fauna
Define: WIN_FAUNAROOT=C:\fauna
Define: SRVROOT=/fauna/apache
Define: WIN_SRVROOT=C:\fauna\apache
Define: PERLPATH=C:\fauna\perl
Define: WIN_PERLPATH=C:\fauna\perl
Define: LANIP=192.168.1.6
Define: PORT=80
因此,显然,做解析VirtualHost
标签。但是,这会产生完全相同的效果,并且两个虚拟主机都会被完全忽略,就好像它们不匹配一样。
编辑 - 我已经mod_info
确认VirtualHost
做确实匹配,但当然由于某种原因被完全忽略DocumentRoot
。DirectoryIndex
答案1
总结:除非我弄错了,否则在主服务器上设置别名需要在虚拟主机中单独设置它们,否则主站点会因为别名而得到服务,特别是如果你/
像我一样设置了别名。我对此不是 100% 确定,但根据我得到的信息,这是有道理的。
我似乎已经使用虚拟主机的这个定义解决了这个问题:
<IfDefine LANACCESS>
<VirtualHost ${LANIP}:${PORT}>
Alias "/" "${SRVROOT}/htdocs/phpinfo/"
# DocumentRoot ${SRVROOT}/htdocs/phpinfo
<Directory "${SRVROOT}/htdocs/phpinfo">
AllowOverride None
# Options -ExecCGI
Require ip 192.168.1
# DirectoryIndex phpinfo.php
</Directory>
Redirect 404 /info
Redirect 404 /status
ServerName ${LANIP}:${PORT}
</VirtualHost>
</IfDefine>
以前,访问会注册为通过虚拟主机,但会提供主页。通过/
与目标建立别名DocumentRoot
,它可以正确提供目标页面。Directory
需要设置适当的权限,否则它似乎会继承以前的Directory
定义或使用默认值等。因此,如果您以前的Directory
定义需要修改,请进行修改。
DocumentRoot
显然没有效果。我不知道为什么,但从主配置中删除它似乎也没有效果。也许我的设置方式覆盖了它。
如果您正在使用或其他Location
操作mod_info
,请使用Redirect 404
取消这些位置或Require
禁止访问,否则它们将正常运行,无论Alias
您设置了什么指令。
Alias
除非您为其余服务器位置设置了es,否则先前的服务器位置在覆盖时/
或由于其他我无法弄清楚的原因似乎处于非活动状态。
答案2
您很可能成为 Windows 文件系统虚拟化的受害者,非管理员编辑的文件对您来说似乎发生了更改,但对于作为服务运行的 httpd 来说却没有变化。
使用真正的管理员帐户编辑您的配置。