我在使用 Wamp 时遇到了一个以前从未遇到过的问题,找不到问题所在。我的 www 文件夹中有几个项目(运行 Windows 7)。
127.0.0.1 localhost
我的主机文件有取消注释的行
当我从 Wamp 主面板页面转到http://localhost/
或http://127.0.0.1/
单击项目名称(如“mysite”)时,链接仅指向“mysite”,而不是"http://localhost/mysite"
因此我看不到任何网站,我该怎么办?
答案1
WAMPServer 2.5 主页、您的项目菜单和虚拟主机
WampServer 2.5 中的概念发生了变化,并且这种变化是有充分理由的!
在 WampServer 2.5 中,现在强烈建议为每个项目创建一个虚拟主机,即使您将它们放在一个\wamp\www\subfolder
结构中。
WampServer 主页( \wamp\www\index.php )现在希望您为所有项目创建一个虚拟主机,因此只有这样做它才能正常工作。
历史
为了让使用 WampServer 的初学者更轻松地学习 PHP Apache 和 MySQL,建议您在该\wamp\www\
文件夹下创建子文件夹。
wamp
|-- www
|-- Chapter1
|-- Chapter2
|-- etc
这些子文件夹随后将显示为 WampServer 主页中名为“您的项目”菜单下的链接,并且这些链接将包含指向的链接localhost/subfoldername
。
仅适用于简单教程
这使得初学者的生活变得轻松,并且对于那些按照教程学习 PHP 编码的人来说是完全可以接受的。但是,它从未打算用于开发您以后想要复制到实时托管服务器的真实网站。事实上,如果您确实使用了这种机制,它经常会导致问题,因为实时网站的配置与您的开发配置不匹配。
问题用于真正的网站开发。
当然,原因是 WAMP 的默认 DocumentRoot 设置是
DocumentRoot "c:/wamp/www/"
无论您的子文件夹叫什么。这意味着,在开发 WampServer 上运行时,查询站点结构的常用 PHP 代码收到的信息与在实时托管服务器上运行时收到的信息不同,其中 DocumentRoot 配置指向网站文件层次结构顶部的文件夹。这种代码存在于许多框架和 CMS 中,例如 WordPress 和 Joomla 等。
例如
wamp\www\project1
假设我们有一个名为 project1 的项目,并且运行不正确,如下所示localhost/project1/index.php
以下是一些有问题的 PHP 命令所报告的内容:
$_SERVER['HTTP_HOST'] = localhost
$_SERVER['SERVER_NAME'] = localhost
$_SERVER['DOCUMENT_ROOT'] = c:/wamp/www
现在,如果我们使用虚拟主机定义正确定义该站点并将其作为运行http://project1
,则 WAMPServer 开发站点上的结果将与在实时托管环境中收到的结果相匹配。
$_SERVER['HTTP_HOST'] = project1
$_SERVER['SERVER_NAME'] = project1
$_SERVER['DOCUMENT_ROOT'] = c:/wamp/www/project1
现在,这种差异乍一看可能微不足道,但是如果您使用像 WordPress 这样的框架或像 Joomla 这样的 CMS 之一,那么当您将网站移动到实时服务器时,这可能会并且确实会导致问题。
如何在 WampServer 中创建虚拟主机
实际上,这对于任何 Windows Apache 服务器来说基本上都是相同的,唯一的区别在于你可以在哪里找到 Apache 配置文件。
在 Apache 中创建您的第一个虚拟主机需要 3 个步骤,如果已经定义了一个虚拟主机,则只需 2 个步骤。
- 创建虚拟主机定义。
- 将您的新域名添加到 HOSTS 文件。
- 取消注释 httpd.conf 中包含虚拟主机定义文件的行。
步骤1、创建虚拟主机定义
编辑名为的文件httpd-hosts.conf
,对于 WampServer,该文件位于
\wamp\bin\apache\apache2.4.9\conf\extra\httpd-hosts.conf
(Apache 版本号可能不同,继续之前请先思考一下)
如果这是您第一次编辑此文件,请删除默认示例代码,它没有用。
我假设我们要为位于
\wamp\www\project1
非常重要,首先我们必须确保 localhost 仍然有效,所以这是我们将放入此文件中的第一个 VHOST 定义。
<VirtualHost *:80>
DocumentRoot "c:/wamp/www"
ServerName localhost
ServerAlias localhost
<Directory "c:/wamp/www">
AllowOverride All
Require local
</Directory>
</VirtualHost>
现在我们定义我们的项目:当然,当您开始一个新项目时,您会对每个项目都这样做。
<VirtualHost *:80>
DocumentRoot "c:/wamp/www/project1"
ServerName project1
<Directory "c:/wamp/www/project1">
AllowOverride All
Require local
</Directory>
</VirtualHost>
注意:每个虚拟主机都有自己的DocumentRoot
定义。您还可以将许多其他参数添加到虚拟主机定义中,请查看 Apache 文档。
小撇
虚拟主机在 Apache 中的工作方式:此文件中的第一个定义也将是默认站点,因此如果浏览器中使用的域名与任何实际定义的虚拟托管域不匹配,则将 localhost 设为文件中的第一个域将使其成为在黑客尝试仅使用您的 IP 地址时加载的站点。因此,如果我们确保此域的 Apache 安全性始终设置为
Require local
任何来自外部地址的随意黑客攻击都会收到错误并且无法进入您的电脑,但如果您拼错了域名,您将看到 WampServer 主页,因为您与 WampServer 在同一台电脑上,因此local
。
第2步:
将新域名添加到 HOSTS 文件中。现在我们需要将虚拟主机定义中使用的域名添加到 HOSTS 文件中,以便 Windows 知道在哪里找到它。这类似于创建 DNS A 记录,但在这种情况下它仅在此特定 PC 上可见。
编辑C:\windows\system32\drivers\etc\hosts
该文件没有扩展名,并且应该保持这种状态。请注意记事本,因为.txt
如果您没有更好的编辑器,它可能会尝试添加扩展名。我建议您下载 Notepad++,它是免费的,而且是一款非常好的编辑器。
此外,这是一个受保护的文件,因此您必须使用管理员权限编辑它,因此使用启动编辑器以管理员身份运行菜单选项。
完成这些编辑后,hosts 文件应如下所示
127.0.0.1 localhost
127.0.0.1 project1
::1 localhost
::1 project1
请注意,您应该在此处定义 IPV4 环回地址127.0.0.1
和 IPV6 环回地址,::1
因为 Apache 现在支持 IPV6,浏览器将使用 IPV4 或 IPV6 或两者。我不知道它如何决定使用哪个,但如果您打开了 IPV6 堆栈,它可以使用其中任何一个,并且大多数 Windows 操作系统(从 XP SP3 开始)都这样做。
现在我们必须告诉 Windows 刷新其域名缓存,因此使用以下命令再次启动命令窗口:以管理员身份运行菜单选项,然后执行以下操作。
net stop dnscache
net start dnscache
这将强制 Windows 清除其域名缓存并重新加载,在重新加载时它将重新读取 HOSTS 文件,因此现在它知道该域project1
。
步骤3:取消注释 httpd.conf 中包含虚拟主机定义文件的行。
编辑您的 httpd.conf,使用 wampmanager.exe 菜单确保您编辑正确的文件。
在 httpd.conf 中找到此行
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
并删除#
该行以取消注释。
要在运行 Apache 时激活此更改,我们现在必须停止并重新启动 Apache 服务。
wampmanager.exe -> Apache -> Service -> Restart Service
现在,如果系统托盘中的 WAMP 图标不再变为绿色,则意味着您可能在文件中做错了什么\wamp\bin\apache\apache2.4.9\conf\extra\httpd-hosts.conf
。
如果是这样,这里有一个有用的机制来找出问题所在。它使用 Apache exe(httpd.exe)的功能来检查其配置文件并按文件名和行号报告错误。
启动命令窗口。
cd \wamp\bin\apache\apache2.4.9\bin
httpd -t
因此,修复错误并再次重新测试,直到获得输出
Syntax OK
现在还有一件事。
wampmanager 菜单系统上实际上有 2 个新菜单项。一个称为 [b]“我的项目”[/b],默认情况下处于启用状态。第二个称为 [b]“我的虚拟主机”[/b],默认情况下未激活。
“我的项目”将列出 \wamp\www 目录的任何子目录,并提供一个链接来启动该子目录中的站点。正如我之前所说,它启动的是“project1”而不是“localhost/project1”,因此要使链接正常工作,我们必须创建一个虚拟主机定义,以使此链接实际上在您的浏览器中启动该站点,如果没有虚拟主机定义,它可能会启动以站点名称作为关键字的 Web 搜索,或者只是返回站点未找到的情况。
“我的虚拟主机”菜单项略有不同。它搜索用于定义虚拟主机的文件(我们稍后会讲到),并为找到的每个 ServerName 参数创建菜单链接,并为每个参数创建一个菜单项。这可能看起来有点令人困惑,因为一旦我们为 \wamp\www 文件夹的子目录创建虚拟主机定义,某些项目就会同时出现在“我的项目”菜单和“我的虚拟主机”菜单中。
我如何打开其他“我的虚拟主机”菜单?
- 备份 \wamp\wampmanager.tpl 文件,以防万一您犯了错误,这是一个非常重要的文件。
- 编辑 \wamp\wampmanager.tpl
- 找到此参数
;WAMPPROJECTSUBMENU
,它位于'[Menu.Left]'部分。 ;WAMPVHOSTSUBMENU
在参数之前或之后添加这个新参数;WAMPPROJECTSUBMENU
。- 保存文件。
- 现在右键单击 wampmanager 图标,然后选择“刷新”。如果这没有添加菜单,请“退出”并重新启动 wampmanager。
大注 只有当您已经定义一些虚拟主机时,新菜单才会出现!否则,除非您定义 VHOST,否则您将看不到任何差异。
现在如果你把它带到它的逻辑延伸
现在,您只需更改 VHOST 定义中的 DocumentRoot 参数,即可将网站代码完全移出\wamp\
文件夹结构。例如,您可以这样做:
在 WAMP 磁盘或任何其他磁盘上创建一个文件夹(注意网络驱动器,它们有点复杂)
D:
MD websites
CD websites
MD example.com
CD example.com
MD www
现在,您将站点代码复制到该文件夹,或者开始在\websites\example.com\www
文件夹中创建它,并像这样定义您的 VHOST:
<VirtualHost *:80>
DocumentRoot "d:/websites/example.com/www"
ServerName example.dev
ServerAlias www.example.dev
<Directory "d:/websites/example.com/www">
AllowOverride All
Require all granted
</Directory>
php_flag display_errors Off
php_flag log_errors On
php_value max_upload_size 40M
php_value max_execution_time 60
php_value error_log "d:/wamp/logs/example_com_phperror.log"
</VirtualHost>
然后将这个新的开发域添加到HOSTS文件中:
127.0.0.1 localhost
::1 localhost
127.0.0.1 project1
::1 project1
127.0.0.1 example.dev
::1 example.dev
笔记:使用与您的实际域名相同的 ServerName 或 ServerAlias 并不是一个好主意,因为如果我们使用 example.com 作为 ServerName,则意味着我们无法再从这台 PC 访问真正的实时站点,因为它会将 example.com 定向到 127.0.0.1,即这台 PC,而不是互联网。
另请参见:请注意,我已允许从 VHOST 定义中的互联网访问此站点,此更改仅适用于此站点,不适用于其他站点。对于允许客户端查看您的更改一小时左右而无需将其复制到实时服务器非常有用。这确实意味着我们必须手动编辑此文件以打开和关闭此访问权限,而不是使用 wampmanager 上的“在线/离线”菜单项。
此外,我还对 PHP 配置进行了一些修改,同样,这些修改仅适用于此网站。在维护与您维护的所有其他网站不同且具有特定要求的网站时非常有用。我想我们可以从使用的参数中推断出它其中某个地方有一个长期运行的页面,并且编写得非常糟糕,并且不会在浏览器中显示错误的情况下运行,而不会使页面变得一团糟。相信我,这样的网站是存在的,人们仍然希望维护它们糟糕地。但这意味着我们只需要为这个特定的站点更改这些参数,而不必全局更改在 WampServer 上运行的所有虚拟站点的这些参数。
答案2
RiggsFolly 的答案对我有用......
如果您想授予文件夹权限并通过浏览器访问它,还需要添加。
在文件 httpd.conf 中创建单独的条目
<Directory "d:/websites/example.com/www">
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
答案3
打开“www”并编辑index.php
寻找: $suppress_localhost = true;
并将其替换为 $suppress_localhost = false;
然后重新启动服务器。