我在 LAN 上设置了一个小型 Windows 服务器,其静态 IP 地址为 192.168.1.100。我还有一些其他客户端计算机,例如 192.168.1.101 - 104。
要求:
- 在主服务器上托管一个 apache 服务器(wampserver),只能在局域网上访问。
- 在端口 8080 上设置默认的 wampserver 工具(例如 phpmyadmin),只能从服务器计算机访问
- 使用端口 8081 作为特殊的内部站点,LAN 上的所有机器都可以访问
我当前的设置如下:
httpd.conf:
ServerRoot "c:/wamp/bin/apache/apache2.2.22"
Listen 8080
Listen 8081
ServerAdmin admin@localhost
ServerName localhost:8080
DocumentRoot "c:/wamp/www/"
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Directory "c:/wamp/www">
Options Indexes FollowSymLinks
AllowOverride all
Order deny,allow
Deny from all
Allow from 192.168.1
</Directory>
<Directory "c:/site1">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 192.168.1
</Directory>
<Directory "cgi-bin">
AllowOverride None
Options None
Order deny,allow
Deny from all
Allow from 192.168.1
</Directory>
httpd-vhosts.conf:
Listen 8080
Listen 8081
NameVirtualHost *:8080
NameVirtualHost *:8081
<VirtualHost *:8080>
ServerName localhost
DocumentRoot c:/wamp/www
</VirtualHost>
<VirtualHost *:8081>
ServerName site1
DocumentRoot c:/site1
</VirtualHost>
- 我在windows服务器上开放了8081端口
- 我在客户端计算机的 hosts 文件中添加了“site1”以指向 192.168.1.100
我在服务器上添加了别名
别名 /site1/“c:/site1/”
选项索引FollowSymLinksMultiViews允许覆盖所有订单允许,拒绝允许所有
现在的问题是,这种行为并不完全是我所需要的。
服务器上的当前行为:
192.168.1.100:8080
满足了我的c:/wamp/www
期望192.168.1.100:8081
也为我服务c:/wamp/www
而不是c:/site1
我期望的- 相反,
192.168.1.100:8081/site1
为我服务c:/site1
客户端机器上的当前行为:
site1:8081
(或 192.168.1.100:8081)c:/wamp/www
在服务器上为我提供服务,而不是c:/site1
我期望的。我不希望客户端可以访问 c:/wamp/www。- 相反, (或 192.168.1.100:8081/site1)在服务器上
site1:8081/site1
为我提供服务。c:/site1
我究竟做错了什么?
答案1
也许关于基于名称的虚拟主机如何工作的解释在这里是有帮助的。
当浏览器发送 192.168.1.100:8081 的请求时,它会连接到 192.168.1.100。端口 8081,随后它将发送 http 请求。这看起来(简化)有点像这样:
host: 192.168.1.100
GET /
Apache 现在需要找出它将从哪个虚拟主机提供响应服务。它通过查看 IP:Port 对来实现这一点,如果 IP:Port 对存在 NamevirtualHost 语句,它还会查看标头host:
。这里要注意的重要一点是,如果您通过 IP 调用站点,标host:
头将包含 IP 地址,而不是主机名称。您需要使用名称(并且它们需要正确解析为正确的 IP)。
如果 Apache 找不到与 IP:Port:Host 组合匹配的虚拟主机,它将默认使用第一个 VirtualHost 部分。这就是这里发生的情况。只需交换两个部分,看看会发生什么...
您需要停止的做法是,通过混合基于命名的虚拟主机和基于端口的虚拟主机来混淆 Apache。换句话说,您需要删除NameVirtualHost
指令.你不需要它们。
最后说明一下:如果目的是阻止 wamp 目录上的除服务器本身之外的所有人,那么您还需要在配置中更改其他内容:
<Directory "c:/wamp/www">
Options Indexes FollowSymLinks
AllowOverride all
Order deny,allow
Deny from all
Allow from 192.168.1.100
</Directory>
这样,只有服务器才能看到这个目录...
答案2
我认为问题出在您基于名称的虚拟主机上。您已通过 ServerName 指令告知其主机名为“site1”,而实际上它们都是 localhost。不要使用基于名称的虚拟主机,只需允许它从端口中进行选择即可。
从 httpd-vhosts.conf 中删除所有 NameVirtualHost 和 ServerName 行。