目前各大网站普遍都把css,js放在独立域名下,这样即提高了页面加载性能又方便了前端工程师开发。由于css,js被存放在单独域名下,所以前端工程师在开发时,不需要在本地搭建服务器端环境,只需在hosts文件中将css,js的域名指到本地即可。
但是修改hosts这种开发方式也有它的缺点。首先看下这种开发方式的域名解析过程。
从上图可以看出,当通过浏览器发起一个请求时,首先浏览器会先查看请求的这个域名在浏览器自身中是否有缓存,如果没缓存,浏览器又会去系统的hosts文件中查看是否有这个域名,如果还没有则会通过DNS找到这个域名对应的IP,然后才能与服务器端进行通信。可以看出查找域名的优先级是浏览器缓存>系统hosts文件>DNS。
这种域名解析机制有2个缺点:
1.当修改hosts文件后,由于该域名可能还在浏览器的缓存时间内,所以达不到即时更新的效果。
2.系统hosts文件是所有浏览器共享的,一旦修改了hosts文件,所有浏览器都会更新。如果你想边在本地环境开发,边访问线上环境,只能再开个虚拟机了。
上网搜了搜,似乎没有实现浏览器级别hosts功能的插件,但是在搜索过程中还是受到了些启发,想到了一个解决方案。
如上图,解决方案就是为浏览器设置代理,这样域名解析就可以跳过浏览器自身域名缓存查找和系统hosts查找。squid可以有自己的hosts文件,使用方式和系统hosts是一样的,所以我们可以把开发需要的环境完全写到squid hosts文件中。如果要切换开发环境(比如本地环境切换到beta环境),只需修改squid hosts再重启squid,环境就会完全更新。这样就解决了第一个问题。
结合这2张图很容易就会想到如何解决第2个问题,那就是为一个浏览器设置代理,另一个浏览器不设置代理,这样一个访问的就是开发环境另一个访问的就是线上环境。在默认情况下,如果你对浏览器设置了代理,那么再打开的同一浏览器同样也应用了这个代理。但是chrome和firefox可以通过命令行参数解决这个问题,实现了不同浏览器实例可以访问不同的环境。
原理说完了,再看下搭建环境步骤:
1.代理服务器配置
squid下载地址:http://squid.acmeconsulting.it/,目前最新的稳定版本是2.7
解压后放到c盘根目录(放到其他路径似乎会出错 懒的折腾了就放在默认路径了)
cmd中 进入squid/etc 执行copy *.default *.
编辑squid.conf 去掉注释 并更改http的访问权限设置
在squid/etc中创建hosts文件 在squid.conf中添加指令 hosts_file c:/squid/etc/hosts
编辑后的squid.conf,其中一些指令都是squid默认开启的,后续可以将一些没用的指令去掉
acl all src all acl manager proto cache_object acl localhost src 127.0.0.1/32 acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 acl localnet src 10.0.0.0/8 # RFC1918 possible internal network acl localnet src 172.16.0.0/12 # RFC1918 possible internal network acl localnet src 192.168.0.0/16 # RFC1918 possible internal network acl SSL_ports port 443 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 # https acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT http_access allow all icp_access allow localnet icp_access deny all http_port 3128 hierarchy_stoplist cgi-bin ? access_log c:/squid/var/logs/access.log squid refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320 acl shoutcast rep_header X-HTTP09-First-Line ^ICY.[0-9]s upgrade_http0.9 deny shoutcast acl apache rep_header Server ^Apache broken_vary_encoding allow apache coredump_dir c:/squid/var/cache hosts_file c:/squid/etc/hosts
进入squid/var 创建cache目录
cmd中进入squid/sbin 执行squid -z
cmd中进入squid/sbin 执行squid -i -n squid_dev squid_dev为服务名,你也可以用别的名字
这个服务创建后默认为开机后自动启动的
在squid/sbin 添加squidServiceRestart.bat 用于重启squid服务 快捷方式到桌面
@echo off rem 使用net命令停止服务有时候巨慢 for /F "tokens=3" %%p in ('sc queryex squid_dev') do ( set PID=%%p ) taskkill /F /pid %PID% net start squid_dev exit
2.浏览器端配置:
firefox
在friefox安装目录添加firefox-dev.bat 快捷方式到桌面
start firefox -no-remote -P "dev" exit
第一次执行会出现一个对话框,告诉你这个名字为dev的profile不存在。你需要手动创建一个名字为dev的profile。以后再打开时就不会提示了。
打开后进行设置代理
高级->网络->设置中 选择手动设置代理 然后在http代理中 输入localhost:3128
chrome
在chrome安装目录添加chrome-dev.bat 快捷方式到桌面
start chrome --proxy-server="localhost:3128" --user-data-dir=G:/broswerData/chrome/dev exit
--proxy-server="localhost:3128" 设置的是代理服务
--user-data-dir 是新的实例保存的目录
到此为止,环境就搭建完了!
你的桌面应该会增加以下几项
接下来我们测试下
首先在squid hosts中添加一个host指向 127.0.0.1 www.baidu.com
开启suqid服务
双击chrome-dev.bat 访问baidu 你会看到baidu是访问不了的
双击chrome 访问baidu 可以访问
这样我们的浏览器级别的hosts就搭建成功了。。。
转载于:https://blog.51cto.com/7438994/1243957