web版apache常见问题之虚拟主机
提问
有一台机器(192.168.1.1)只为一个域名提供服务,设定虚拟主机
NameVirtualHost 192.168.1.1:80
<VirtualHost 192.168.1.1:80>
ServerAdmin webmaster@mydomain.com
ServerName www.mydomain.com
DocumentRoot /home/www/apache
</VirtualHost>
这样使用 www.mydomain.com 可以访问 使用IP可以访问没问题,但是有一个人.他把 www.shitdomain.com DNS也解析到 192.168.1.1 这样是使用他的 www.shitdomain.com 也可以访问我的站点., 我现在只有在 www.mydomain.com 前面随便一个虚拟主机.这样 www.shitdomain.com 访问不到 www.mydomain.com了!
回答:
NameVirtualHost 192.168.1.1:80
<VirtualHost 192.168.1.1:80>
ServerName 192.168.1.1
DocumentRoot /dev/null
</VirtualHost>
<VirtualHost 192.168.1.1:80>
ServerAdmin webmaster@mydomain.com
ServerName www.mydomain.com
DocumentRoot /home/www/apache
</VirtualHost>
提问
我apache中有两个虚拟主机 111.com 和 222.com
目前都能正常使用
111.com中可以解释php和html,这也是apache的主配置
222.com中我想让他只解释html,而不来解释php等,
请问要如何来设计和配置呢?
回答:
把解析php的配置仅仅放入需要解析的虚拟主机的配置段
呵呵~~~成功了,把这两条语句从主配置里禁用掉,放到你想让他生效的虚拟主机段中去就可以了
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
提问
我的主机上有两个基于域名的虚拟主机,我想实现如下功能:只能通过我限定的域名访问,不可以通过输入IP地址的方式访问,请问该如何做呢?谢谢。举例说明。新浪,用域名www.sina.com.cn可以访问,用地址http://218.57.9.53就不可以。我就是想实现这样的功能。
回答:我找到方法了,apache的配置文件认为如果找不到所对应的域名,就自动转交给第一个域名,所以我把第一个域名下放置一个错误页就ok了。
我的相关配置如下:
NameVirtualHost *
<VirtualHost *>
ServerName error.wework.cn
DocumentRoot /usr/local/ahache/htdocs/error
</VirtualHost>
<VirtualHost *>
ServerName bbs.wework.cn
ServerAlias bbs.wework.com.cn
DocumentRoot /usr/local/ahache/htdocs/bbs
</VirtualHost>
<VirtualHost *>
ServerName www.wework.cn
ServerAlias www.wework.com.cn wework.cn wework.com.cn
DocumentRoot /usr/local/ahache/htdocs/www
</VirtualHost>
提问
版本:Server version: Apache/2.2.4 (Unix)
httpd.conf 默认的,没怎么改,就去掉了Include conf/extra/httpd-vhosts.conf的注释
extra/httpd-vhosts.conf内容:
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
Servername www.123.com
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@ncxxy.com
DocumentRoot /root/a/
ServerName www.ncxxy.com
<Directory /root/a>
Options FollowSymLinks
AllowOverride None
Order Allow,Deny
Allow from all
</Directory>
DirectoryIndex a.html
</VirtualHost>
默认域为123.com,所以在这里建了一个123.com的虚拟主机
ncxxy.com为另外一个虚拟主机,目录在/root/a下
在客户机上hosts文件添加了www.ncxxy.com ip
访问出现403错误
请问还有什么地方没有注意到的吗?
回答:
1 http.conf里找
<Directory />
看有没有deny from all
2 果然,我把/root/a 换到了/home下,可以访问了
提问
我在APACHE中配置了基于IP的虚拟主机,希望通过输入IP地址就能访问PERL CGI,而不必输入一长串IP/cgi-bin/dir/index.pl来访问.但当我配好后打开网页访问时,网页上将我程序的代码都显示出来了, #/usr/bin/perl use strict; use warnings;....等等.
我的虚拟主机配置块是:
<VirtualHost 10.0.0.147:80>
DocumentRoot /usr/local/apache2/cgi-bin/dir
ServerName www.dir.com.cn
ErrorLog logs/dir-error_log
CustomLog logs/dir-access_log common
</VirtualHost>
其他地方没修改,请问是哪儿的问题?请各位赐教!!
回答:
Apache没有被正确配置以执行CGI程序
要让CGI程序能正常运作,必须配置Apache以允许CGI的执行,其方法有多种。
ScriptAlias
ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中文件都是CGI程序并试图运行。
ScriptAlias指令形如:
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
如果Apache被安装到默认的位置,默认的配置文件httpd.conf中则会有上述配置。ScriptAlias指令定义了映射到一个特定目录的URL前缀,与Alias指令非常相似,两者一般都用于指定位于DocumentRoot目录以外的目录,其区别是ScriptAlias又多了一层含义,即其URL前缀中任何文件都被视为CGI程序。所以,上述例子会指示Apache,/cgi-bin/应该指向/usr/local/apache/cgi-bin/目录,且视之为CGI程序。
举例,如果有URL为http://www.example.com/cgi-bin/test.pl的请求,Apache会试图执行/usr/local/apache/cgi-bin/test.pl文件并返回其输出。当然,这个文件必须存在而且可执行,并以特定的方法产生输出,否则Apache返回一个出错消息。
ScriptAlias目录以外的CGI
由于安全原因,CGI程序通常被限制在ScriptAlias指定的目录中,如此,管理员就可以严格地控制谁可以使用CGI程序。但是,如果采取了恰当的安全方法措施,则没有理由不允许其他目录中的CGI程序运行。比如,你可能希望用户在UserDir指定的宿主目录中存放页面,而他们有自己的CGI程序,但无权存取cgi-bin目录,这样,就产生了运行其他目录中CGI程序的需求。
用Options显式地允许CGI的执行
可以在主服务器配置文件中,使用Options指令显式地允许特定目录中CGI的执行:
<Directory /usr/local/apache/htdocs/somedir>
Options +ExecCGI
</Directory>
上述指令使Apache允许CGI文件的执行。另外,还必须告诉服务器哪些文件是CGI文件。下面的AddHandler指令告诉服务器所有带有cgi或pl后缀的文件是CGI程序:
AddHandler cgi-script cgi pl
.htaccess文件
.htaccess文件是针对目录进行配置的一种方法。Apache在提供一个资源时,会在此资源所在目录中寻找.htaccess文件,如果有,则使其中的指令生效。AllowOverride 指令决定了.htaccess文件是否有效,它指定了哪些指令可以出现在其中,或者根本不允许使用。为此,需要在主服务器配置中如此配置:
AllowOverride Options
在.htaccess文件中,需要如此配置:
Options +ExecCGI
以使Apache允许此目录中CGI程序的执行。
提问:
的虚拟主机是基于域名的,我在主配置文件里的设置如下
NameVirtualHost 192.168.1.239
<VirtualHost apache.send.com>
ServerName apache.send.com:80
DocumentRoot /www/send.com
</VirtualHost>
<VirtualHost apache.sendmail.com>
ServerName apache.sendmail.com:80
DocumentRoot /www/sendmail.com
</VirtualHost>
同时我还定义了默认的文件查找名,如下:
DirectoryIndex index.html long.html yang.html
以前我在/var/www/html/里定义了默认的index.html,我把/conf.d/下的welcome.conf也删掉了
我的默认主机域名是apache.mail.com
然后我在相应的/www/下都建立好了目录和文件,最后我用http://apache.mail.com的时候却跳到apache.send.com里的页面去了,
到今天我还是没解决掉,请高手指点,谢谢!!
回答:
NameVirtualHost 192.168.1.239
<VirtualHost *:80>
ServerName apache.send.com
DocumentRoot /www/send.com
</VirtualHost>
<VirtualHost *:80>
ServerName apache.sendmail.com
DocumentRoot /www/sendmail.com
</VirtualHost>
提问
AS4 平台使用tar包安装apache2.2.2,编译命令为:
./configure --prefix=/usr/local/apache --enable-so
安装成功后,可以正常访问定义在httpd.conf里面的网页(DoumentRoot)
修改httpd.conf里面的
# Virtual hosts
Include conf/extra/httpd-vhosts.conf拟实现虚拟基于名称的虚拟主机功能,但IE访问怎么也定位不到httpd-vhost.conf控制文件里定义的目录,
请问在开启虚拟主机功能,还需要做什么?谢谢.
httpd-vhosts.conf文件内容如下:
NameVirtualHost *:80
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
ServerAdmin webmaster@mail.njqlx.com
DocumentRoot /data/mail
ServerName mail.njqlx.com
ServerAlias mail.njqlx.com
ErrorLog logs/mail.njqlx.com-error_log
CustomLog logs/mail.njqlx.com-access_log common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@cms.njqlx.com
DocumentRoot /data/cms
ServerName cms.njqlx.com
ErrorLog logs/cms.njqlx.com-error_log
CustomLog logs/cms.njqlx.com-access_log common
</VirtualHost>
感觉像是vhost不起作用一样
回答:
Include 后面用绝对路径
eg.
Include /usr/local/apache2/conf/extra/httpd-vhosts.conf
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论