Faux site Web en ligne hors ligne

15

Je développe un site Web à l'aide d'un serveur local, mais j'ai des dépendances distantes. Je voudrais simuler des demandes de fichiers provenant de serveurs distants. Par exemple, lorsque le navigateur fait une demande pour fooCDN.com/bloatedLib.jsle contenu de /Users/name/Desktop/bloatedLib.jssera retourné.

J'utilise un mac et une solution qui fonctionne au niveau du système ou du navigateur serait bien. Si cela fonctionne au niveau du navigateur, seule une solution Firefox ou Chrome sera correcte. Je ne peux pas utiliser d'ordinateur Windows.

Daniel F
la source
Pouvez-vous utiliser un ordinateur Windows?
geek1011
@ geek1011 Non, ce ne serait pas possible
Daniel F
5
Vous ne savez pas si je vous comprends bien, mais essayez-vous d'accéder à un site Web même si vous n'avez pas de connexion à Internet? et si oui, accéder à une copie locale? Comme un serveur proxy?
LPChip
@LPChip J'ai besoin que des dépendances externes comme jQuery soient chargées même lorsque je suis hors ligne. Il s'agit du référentiel de quelqu'un d'autre, donc je ne peux pas simplement rendre les dépendances externes locales. S'il pouvait simplement charger la version dans le cache du navigateur lorsqu'il est hors ligne, ce serait parfait. La plupart du site Web se trouve sur un serveur local.
Daniel F
Vous pouvez utiliser HTML5 "applications Web hors ligne"
Michael

Réponses:

11

J'ai piraté ce petit serveur proxy pour télécharger uniquement les fichiers manquants. Configurez simplement votre fichier / etc / hosts pour pointer les sites que vous souhaitez mettre en cache à 127.0.0.1 et ceux que vous souhaitez bloquer à 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 
'

Notez qu'il place tous les fichiers dans un seul répertoire, ce qui peut entraîner des conflits de version. (Je l'ai fait intentionnellement pour ne pas avoir 500 copies de jquery)

technosaurus
la source
Pouvez-vous commenter votre code afin que je puisse mieux le comprendre. J'aime beaucoup cette réponse car je n'ai pas besoin d'installer beaucoup de logiciels
Daniel F
1
@DanielF J'ai ajouté quelques commentaires en ligne. Faites-moi savoir si cela a du sens, c'est probablement l'un des hacks les plus hackers que j'ai écrits. Je ne l'ai écrit que par nécessité parce que je n'arrêtais pas de recevoir des décrochages de navigateur attendant une ressource occupée. Je devrais mentionner que j'utilisais chiot Linux quand je l'ai écrit, donc certaines lignes peuvent avoir besoin d'être exécutées sudo.
technosaurus
Remarque: certains navigateurs peuvent avoir besoin d'un véritable en-tête http au lieu de simplement "attraper" le fichier (bien qu'aucun des miens ne l'ait fait). Si vous avez un navigateur qui n'accepte / ne corrige pas ce mauvais comportement, vous pouvez utiliser stat pour obtenir la taille du fichier et l'utiliser pour imprimer un en-tête approprié.
technosaurus
@technosaurus: J'essaie d'implémenter quelque chose de similaire, mais je reçois une erreur: illegal option -- epouvez-vous m'aider?
Anurag Peshne
@AnuragPeshne, il existe plusieurs implémentations variées de netcat; selon l'implémentation que vous utilisez, vous pourrez peut-être utiliser le -cparamètre pour exécuter un script (comme -esans la sh -cpartie)
technosaurus
24

Il semble que vous exécutiez un serveur Web local. Excellent.

Dans le système de fichiers de votre Mac, il existe un fichier appelé /etc/hosts. Vous pouvez rediriger toutes les demandes fooCDN.comvers votre machine locale en ajoutant cette ligne dans /etc/hosts:

127.0.0.1   foocdn.com www.foocdn.com

Vous aurez besoin des autorisations root (super utilisateur) pour modifier /etc/hosts.

La ligne ci-dessus signifie que cela fooCDN.comse chargera à partir de votre propre ordinateur, où un serveur Web écoute.

Cependant, vous n'avez pas spécifié quel serveur Web vous exécutez localement. En suivant la documentation du serveur Web, vous devez créer un hôte virtuel qui pointe la racine du document fooCDN.comvers /Users/name/Desktop/.

Ceci est un exemple de configuration (je ne l'ai pas testé moi-même) que vous pouvez essayer d'utiliser avec Apache :

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

Voici un exemple de configuration pour Nginx (également non testé):

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

N'oubliez pas de redémarrer le service de votre serveur Web ou de recharger le nouveau fichier de configuration.

Deltik
la source
Votre réponse était bonne, mais j'ai accepté la réponse qui ne nécessitait rien de mon installation
Daniel F
@DanielF: Oh, vous n'utilisez donc pas de serveur Web local?
Deltik
1
@Deltik Correct. Il veut pouvoir demander fooCDN.comun fichier lorsqu'il n'a pas de connexion Internet.
BenjiWiebe
2

Vous pouvez utiliser un logiciel de serveur proxy qui prend en charge la réécriture d'URL pour accomplir la tâche. De nombreuses applications de serveur proxy prennent en charge la réécriture d'URL. Par exemple, l'application Charles Debugging Proxy pour Windows, Mac OS et Linux prend en charge la réécriture d'URL . Vous pouvez l'installer sur votre système Mac, puis configurer les navigateurs sur le système pour utiliser le serveur proxy.

Alternativement, Apache , qui est gratuit et open source, a des modules mod_proxy et mod_rewrite .

Mitmproxy est gratuit et fonctionnera également sur un système Mac OS X.

Si vous devez extraire des éléments du cache de votre navigateur pour les rendre disponibles via le serveur proxy, vous pouvez utiliser les techniques fournies dans Affichage du cache Chrome (la manière la plus simple) . Par exemple, dans Google Chrome, vous pouvez mettre chrome:\\cachedans la barre d'adresse du navigateur, puis localiser les éléments pertinents dans le cache Chrome et les copier ailleurs.

point de lune
la source
Connaissez-vous des logiciels autres que Charles, en particulier des logiciels libres?
Daniel F
Votre réponse est bonne, mais j'ai accepté l'autre réponse qui ne nécessite pas de logiciel non libre.
Daniel F
C'est très bien; La solution de Deltik est une bonne solution pour votre situation. J'ai ajouté quelques alternatives gratuites à Charles.
moonpoint
1
@DanielF Un autre proxy de débogage est Fiddler, qui a une version alpha OS X et prend en charge les réponses de fichier et la relecture de réponses spécifiques . C'est aussi plus fin que de rediriger tout le domaine.
Bob
2

On dirait que le bon vieux wwwoffle devrait répondre à vos besoins. C'est un serveur proxy où vous pouvez sélectionner des ressources pour une utilisation hors ligne.

MvG
la source