实现虚拟主机的三种方法
1.基于IP的虚拟主机,每个网站都需要一个IP。缺点:需要多个IP,如果是公网IP,每个IP都需要付费
2.基于端口的虚拟主机,只需要一个IP。缺点:端口号无法告诉公网用户,无法适用于公网用户,适合内部用户。
3.基于主机名,为了使用基于域名的虚拟主机,必须指定服务器IP地址(和可能的端口)来使主机接受请求。
实现平台为apache-2.4.3;其实现的服务httpd监听端口为80端口
实现虚拟主机先注释掉主配置文件/etc/httpd/conf/httpd.conf中的中心主机项:
DocumentRoot “/var/www/html”
1、基于IP的虚拟主机实现:
本机的ip地址为172.168.1.1;还需要再添加一个IP地址
ifconfig eth0:0 172.168.1.2/16
在主配置文件:/etc/httpd/conf/httpd.conf;添加如下内容:
<VirtualHost 172.168.1.1:80>
DocumentRoot “/web/site1”
ServerName 172.168.1.1
<VirtualHost 172.168.1.2:80>
DocumentRoot “/web/site2”
ServerName 172.168.1.2
在上面添加了两个站点site1,site2,
为其创建两个目录:
mkdir -pv /web/{site1,site2}
为站点1提供网页:
vim /web/site1/index.html 添加如下内容:
www.magedu.com
为站点2提供网页:
vim /web/site2/index.html 添加如下内容:
www2.magedu.com
检查语法:
httpd -t
重启服务:
service httpd restart
2、基于端口的虚拟主机实现
在配置文件/etc/httpd/conf/httpd.conf添加8080监听端口
Listen 80
Listen 8080
设置主配置文件:/etc/httpd/conf/httpd.conf
<VirtualHost 172.168.1.1:80>
DocumentRoot “/web/site1”
ServerName 172.168.1.1
<VirtualHost 172.168.1.1:8080>
DocumentRoot “/web/site2”
ServerName 172.168.1.2
重启服务:
service httpd restart
同时使用IP和端口的虚拟主机实现
添加第三个站点:
<VirtualHost 172.168.1.2:80>
DocumentRoot “/web/site3”
ServerName 172.168.1.2
为第三个站点设置目录和添加页面内容:
mkdir -pv /web/site3
vim /web/site3/index.html
www3.magedu.com
重启服务:
service httpd restart
4、基于IP和端口的虚拟主机不常用,常用的是基于域名的虚拟主机基于域名的虚拟主机的IP和端口是一样的,不同之处是ServerName.
容器就是基于ServerName来判定虚拟主机是相对于哪一个站点来访问的.而基于域名的虚拟主机在apache2.2以后必须要启用配置文件中的NameVirtualHost *:80
NameVirtualHost www.magedu.com:80
在本机进行域名解析测试:
vim /etc/hosts 添加:
172.16.81.1 www.magedu.com www
172.168.1.1 www2.magedu.com www
根据实际需要,在容器中可添加相关的应用:
<VirtualHost *:80>
ServerAdmin
DocumentRoot ##网页文件路径
ServerName ##主机名
ErrorLog logs/ ##定义网站的错误日志
CustomLog logs/ ##定义网站的访问日志
跨域
一、什么是跨域?
在了解什么是跨域的时候,我们首先要了解一个概念,叫同源策略,什么是同源策略呢,就是 我们的浏览器出于安全考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。
什么是本域呢?就是同协议,同域名,同端口就叫本域。
1
2
3
浏览器请求的三种报错:
1、请求未发送
2、请求发送后,服务器发现不一样,服务器未反应。
3、请求发送,服务器有反应,数据返回的时候,浏览器发现不对,被拦截。
二、跨域的解决方法
强行实现跨域
1、JSONP (JSON with padding)
就是与后端协商好,在请求数据返回数据的时候以字符串的格式返回。
script src = ‘xxx.com’ callback = showDate
function showDate (ret) {
console.log(ret)
}
这个时候就跨域了,JSONP 可以在IE10以下的浏览器去获取数据。
2、CORS (跨资源共享)
在响应头里面写上
res.setHeader(’ Access - Contorl - Allow - Origin’ ,‘http://localhost:8080’)
只要响应头里面的Origin里面本域(协议、域名、端口)一样,就可以接受到数据
3、降域和PostMessage
3.1 降域
document.domain = ‘xxx.com’
需要本域中的域名和端口一样
3.2 PostMessage
window.frames[0],PostMessage(this,value)
window.addEventListener(‘message’,function(e)){} //调用message,监听对方发送的消息
跨域知识点整理
那就是浏览器的“同源策略”(即协议相同,域名相同,端口相同)。如果非同源,共有三种行为会受到限制:
(1) Cookie,LocalStorage和IndexdDB无法读取
(2) DOM无法获得
(3) AJAX请求不能发送
Cookie
Cookie 是服务器写入浏览器的一小段信息,只有同源的网页才能共享。我们可以在cookie中设置domain的值为一级域名,这样一级域名相同,二级域名不同的网页也可以共享cookie。
iframe
如果两个网页不同源,就无法拿到对方的DOM。对于完全不同源的网站,目前有三种方法,可以解决跨域窗口的通信问题。
片段标识符
window.name
跨文档通信API
片段标识符
片段标识符(fragment identifier)指的是,URL的#号后面的部分,比如http://example.com/x.html#fragment的#fragment。如果只是改变片段标识符,页面不会重新刷新。
父窗口可以把信息,写入子窗口的片段标识符。
window.name
浏览器窗口有window.name属性。这个属性最大的特点是,无论是否同源,只要在同一个窗口里,前一个网页设置了这个属性,后一个网页就可以读取它。比如说,一个网页中包含一个iframe,我们把它的window.name设置为我们想访问的内部数据。这样在该网页中就能通过document.getElementById(‘myFrame’).contentWindow.name来访问它了。
这种方法的优点是,window.name容量很大,可以放置非常长的字符串;缺点是必须监听子窗口window.name属性的变化,影响网页性能。
otherWindow指目标窗口,也就是给哪个window发消息,是window.frames的成员或者由window.open方法创建的窗口。
参数说明:
message:是要发送的消息,类型为 String、Object (IE8、9 不支持)
targetOrigin: 是限定消息接收范围,不限制请使用 ‘*’