离线时伪造在线网站


15

我正在使用本地服务器开发网站,但是我具有远程依赖性。我想伪造来自远程服务器的文件请求。例如,当浏览器请求fooCDN.com/bloatedLib.js内容时,/Users/name/Desktop/bloatedLib.js将返回。

我使用的是Mac,可以在系统或浏览器级别使用的解决方案很好。如果它可以在浏览器级别运行,则仅Firefox或Chrome解决方案可以。我无法使用Windows计算机。


您可以使用Windows计算机吗?
geek1011 2015年

@ geek1011不,那不可能
Daniel F

5
不确定我是否理解正确,但是即使您没有连接互联网,您是否也尝试访问一个网站?如果可以,请访问本地副本?像代理服务器吗?
LPChip

@LPChip即使离线,我也需要加载jQuery之类的外部依赖项。这是其他人的存储库,因此我不能仅将外部依赖项设置为本地。如果它可以在脱机时仅将版本加载到浏览器缓存中,那么ti将是完美的。大多数网站都在本地服务器上。
Daniel F

您可以使用HTML5“离线网络应用程序”
Michael

Answers:


11

我把这个小代理服务器砍在一起,只下载丢失的文件。只需将/ etc / hosts文件设置为指向要在127.0.0.1处缓存的站点和要在0.0.0.0处阻止的站点即可

#!/bin/sh 
nc -ll -p 80 -e sh -c ' 
while read A B DUMMY 
do 
   case "$A" in 
      [Gg][Ee][Tt]) 
         FULL=$B #full path of the file
         F=${FULL##*/}
         F=${F%%\?*} #file name only
         #if we have it cat it back to browser
         [ -f "$F" ] && cat "$F" && break 
      ;; 
      [Hh][Oo][Ss][Tt]*) 
         [ -f "$F" ] && break #file already exists
         HOST=${B:0:$((${#B}-1))} #the host name
         #resolve by DNS first so we can cache it
         sed -i "s/hosts:\t\tfiles /hosts:\t\t/g" /etc/nsswitch.conf 
         wget -t 0 -q --no-dns-cache $HOST$FULL
         #got it now revert to checking host file 1st
         sed -i "s/hosts:\t\t/hosts:\t\tfiles /g" /etc/nsswitch.conf
         #cat the file because I didn't think to wget through tee
         cat "$F" 
         break 
      ;; 
   esac 
done 
'

请注意,它将所有文件放在一个目录中,因此可能会导致版本冲突。(我是故意这样做的,所以我不会有500个jquery副本)


您能否注释您的代码,以便我更好地理解。我非常喜欢这个答案,因为我不需要安装很多软件
Daniel F

1
@DanielF我添加了一些内联注释。让我知道是否有意义,这可能是我所写的最骇客的骇客之一。我之所以只写它是不必要的,因为我一直让浏览器停滞等待一个繁忙的资源。我应该提一下,我在编写它时使用的是小狗Linux,因此可能需要在sudo中运行某些行。
technosaurus

注意:有些浏览器可能需要一个实际的http标头,而不只是“捕获”该文件(尽管我的都没有)。如果您的浏览器不接受/修复此不良行为,则可以使用stat获取文件大小并使用它来打印适当的标题。
龙2015年

@technosaurus:我正在尝试实现类似的功能,但是却遇到一个错误:illegal option -- e,您能帮上忙吗?
Anurag Peshne 2015年

@AnuragPeshne有多种不同的netcat实现;根据您使用的实现,您可以使用-c参数来运行脚本(与-e没有脚本的sh -c部分相同 )
technosaurus

24

听起来您正在运行本地Web服务器。优秀。

在Mac的文件系统中,有一个名为的文件/etc/hosts。您可以fooCDN.com通过在/etc/hosts以下位置添加以下行来将所有请求重定向到本地计算机:

127.0.0.1   foocdn.com www.foocdn.com

您将需要root(超级用户)权限进行编辑/etc/hosts

上面的行表示fooCDN.com将从Web服务器正在监听的您自己的计算机加载。

不过,您没有指定要在本地运行的Web服务器。根据Web服务器的文档,您应该创建一个虚拟主机,将其文档根fooCDN.com指向/Users/name/Desktop/

这是一个示例配置(我自己尚未测试过),可以尝试与Apache一起使用:

<VirtualHost 127.0.0.1:80>
    ServerName foocdn.com
    ServerAlias www.foocdn.com
    DocumentRoot /Users/name/Desktop
</VirtualHost>

这是Nginx的示例配置(也是未经测试的):

server {
    listen 80;
    root /Users/name/Desktop;
    server_name foocdn.com;
}

不要忘记重新启动您的Web服务器服务或重新加载新的配置文件。


您的回答很好,但我接受了不需要安装任何设备的答案
Daniel F

@DanielF:哦,所以您没有运行本地Web服务器?
Deltik

1
@Deltik正确。他希望能够在fooCDN.com没有Internet连接的情况下请求文件。
BenjiWiebe,2015年

2

您可以使用支持URL重写的代理服务器软件来完成任务。许多代理服务器应用程序支持URL重写。例如,适用于Windows,Mac OS和Linux 的Charles Web调试代理应用程序支持URL重写。您可以将其安装在Mac系统上,然后将系统上的浏览器配置为使用代理服务器。

另外,免费和开放源代码的Apache具有mod_proxymod_rewrite模块。

Mitmproxy是免费的,也可以在Mac OS X系统上运行。

如果您需要从浏览器的缓存中拉出项目以使其可通过代理服务器使用,则可以使用“ 查看Chrome缓存”中提供的技术(简便方法)。例如,在Google Chrome浏览器中,您可以放入chrome:\\cache浏览器的地址栏中,然后在Chrome浏览器缓存中找到相关项目,然后将其复制到其他位置。


您是否知道除Charles以外的任何软件,尤其是自由软件?
Daniel F

您的回答很好,但是我接受了另一个不需要非自由软件的答案。
Daniel F

没关系; Deltik的解决方案适合您的情况。我为查尔斯添加了一些免费的替代方案。
moonpoint 2015年

1
@DanielF另一个调试代理是Fiddler,它具有alpha OS X构建,并支持文件响应重放特定响应。与重定向整个域相比,它的粒度更细。
鲍勃

2

听起来不错,老wwwoffle应该适合您的需求。这是一个代理服务器,您可以在其中选择资源以供脱机使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.