
Selbst gehostete Alternative zu 12ft.io. und 1ft.io. Proxy zum Entfernen von CORS-Headern und Modifizieren von HTML.
Ladder ist ein HTTP-Webproxy.
Ladder ist ein Entwicklerwerkzeug zum Testen und Analysieren von Paywall-Implementierungen und des Content-Delivery-Verhaltens moderner Websites.
Es ermöglicht Entwicklern, Forschern und Publishern, verschiedene Client-Umgebungen (wie Browser und Crawler) zu simulieren und zu beobachten, wie Inhalte unter verschiedenen Bedingungen ausgeliefert werden. Das ist nützlich zum Debuggen von Paywall-Konfigurationen, zur Überprüfung von Zugriffskontrollen, HTTP-Headern und zur Sicherstellung konsistenten Verhaltens über verschiedene User Agents hinweg.
Ladder ist ausschließlich für legitime Test-, Forschungs- und Qualitätssicherungszwecke gedacht. Es sollte nur in Übereinstimmung mit geltendem Recht und den Nutzungsbedingungen der Zielwebsite verwendet werden.

sequenceDiagram
client->>+ladder: GET
ladder-->>ladder: apply RequestModifications
ladder->>+website: GET
website->>-ladder: 200 OK
ladder-->>ladder: apply ResultModifications
ladder->>-client: 200 OKManche Websites liefern je nach Art des zugreifenden Clients unterschiedliche Inhalte aus (Cloaking) – zum Beispiel Suchmaschinen-Crawler gegenüber Standard-Webbrowsern. Ladder kann so konfiguriert werden, dass es verschiedene Client-Typen emuliert, um öffentlich zugängliche Inhalte für Test-, Automatisierungs- oder Forschungszwecke abzurufen.
Viele Websites setzen jedoch fortschrittliche Mechanismen ein, um automatisierten Zugriff einzuschränken, etwa Fingerprinting, Rate Limiting oder Verhaltensanalyse. Ladder umgeht solche Schutzmaßnahmen nicht und funktioniert möglicherweise nicht korrekt auf Diensten, die den Zugriff aktiv einschränken oder kontrollieren.
Es gibt Drittanbieter-Tools wie FlareSolverr, die unabhängig verwendet werden können, um Webseiten in einer Headless-Browser-Umgebung darzustellen. Diese Tools sind nicht Teil von Ladder, und ihre Verwendung kann rechtlichen und vertraglichen Beschränkungen unterliegen. Die Nutzer sind allein dafür verantwortlich, dass ihre Nutzung allen geltenden Vorschriften entspricht.
Warnung: Wenn Ihre Instanz öffentlich erreichbar sein wird, aktivieren Sie unbedingt Basic Auth. Dadurch wird verhindert, dass unautorisierte Benutzer Ihren Proxy verwenden. Wenn Sie Basic Auth nicht aktivieren, kann jeder Ihren Proxy zum Besuchen unangenehmer/illegaler Inhalte nutzen. Und Sie werden dafür verantwortlich gemacht.
./ladder -r https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yamldocker run -p 8080:8080 -d --env RULESET=https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml --name ladder ghcr.io/everywall/ladder:latest
curl https://raw.githubusercontent.com/everywall/ladder/main/docker-compose.yaml --output docker-compose.yaml
docker-compose up -d
Weitere Informationen finden Sie in der README.md im Unterverzeichnis helm-chart: README.md.
Oder direkt, indem die URL an das Ende der Proxy-URL angehängt wird: http://localhost:8080/https://www.example.com
Oder ein Lesezeichen mit der folgenden URL erstellen:
javascript:window.location.href="http://localhost:8080/"+location.href
curl -X GET "http://localhost:8080/api/https://www.example.com"
http://localhost:8080/raw/https://www.example.com
ALLOWED_DOMAINS und ALLOWED_DOMAINS_RULESET werden kombiniert. Sind beide leer, gelten keine Einschränkungen.
| BASE_PATH | Basis-Pfad für den Proxy; nützlich, wenn der Proxy unter einem Unterpfad laufen soll (z. B. http://localhost:8080/proxy/) | `` |
Es ist möglich, benutzerdefinierte Regeln anzuwenden, um die Antwort oder die angeforderte URL zu ändern. Damit können unerwünschte Elemente von der Seite entfernt oder geändert werden. Das Ruleset ist eine YAML-Datei, ein Verzeichnis mit YAML-Dateien oder eine URL zu einer YAML-Datei, die eine Liste von Regeln für jede Domain enthält. Diese Regeln werden beim Start geladen.
Ein Basis-Ruleset ist in einem separaten Repository verfügbar: ruleset.yaml. Fügen Sie gerne eigene Regeln hinzu und erstellen Sie einen Pull Request.
- domain: example.com # Includes all subdomains
domains: # Additional domains to apply the rule
- www.example.de
- www.beispiel.de
headers:
x-forwarded-for: none # override X-Forwarded-For header or delete with none
referer: none # override Referer header or delete with none
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
content-security-policy: script-src 'self'; # override response header
cookie: privacy=1
regexRules:
- match: <script\s+([^>]*\s+)?src="(/)([^"]*)"
replace: <script $1 script="/https://www.example.com/$3"
injections:
- position: head # Position where to inject the code
append: | # possible keys: append, prepend, replace
<script>
window.localStorage.clear();
console.log("test");
alert("Hello!");
</script>
- domain: www.anotherdomain.com # Domain where the rule applies
useFlareSolverr: false # Use FlareSolverr for Cloudflare bypass (optional, default: false)
paths: # Paths where the rule applies
- /article
googleCache: false # Use Google Cache to fetch the content
regexRules: # Regex rules to apply
- match: <script\s+([^>]*\s+)?src="(/)([^"]*)"
replace: <script $1 script="/https://www.example.com/$3"
injections:
- position: .left-content article .post-title # Position where to inject the code into DOM
replace: |
<h1>My Custom Title</h1>
- position: .left-content article # Position where to inject the code into DOM
prepend: |
<h2>Subtitle</h2>
- domain: demo.com
headers:
content-security-policy: script-src 'self';
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36
urlMods: # Modify the URL
query:
- key: amp # (this will append ?amp=1 to the URL)
value: 1
domain:
- match: www # regex to match part of domain
replace: amp # (this would modify the domain from www.demo.de to amp.demo.de)
path:
- match: ^ # regex to match part of path
replace: /amp/ # (modify the url from https://www.demo.com/article/ to https://www.demo.de/amp/article/)
Ladder unterstützt jetzt die Integration mit FlareSolverr, um den Cloudflare-Schutz und andere Anti-Bot-Herausforderungen zu umgehen. Dies ist besonders nützlich für Websites, die ausgefeilte Bot-Erkennungsmechanismen einsetzen.
Mit Docker Compose (empfohlen):
# docker-compose.yaml
services:
ladder:
image: ghcr.io/everywall/ladder:latest
ports:
- "8080:8080"
environment:
- RULESET=https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml
# - FLARESOLVERR_HOST=http://flaresolverr:8191
depends_on:
- flaresolverr
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
ports:
- "8191:8191"
environment:
- LOG_LEVEL=info
FlareSolverr separat ausführen:
docker run -d \
--name flaresolverr \
-p 8191:8191 \
ghcr.io/flaresolverr/flaresolverr:latest
Starten Sie Ladder dann mit der FlareSolverr-URL:
FLARESOLVERR_HOST=http://localhost:8191 ./ladder
Um FlareSolverr für bestimmte Domains zu verwenden, fügen Sie das Flag useFlareSolverr: true in Ihrem Ruleset hinzu:
# Example ruleset with FlareSolverr
- domain: cloudflare-protected-site.com
useFlareSolverr: true # Enable FlareSolverr for this domain
headers:
user-agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
# Regular site without FlareSolverr
- domain: regular-site.com
headers:
user-agent: "Custom User Agent 1.0"
Die FlareSolverr-Integration ist besonders nützlich für:
useFlareSolverr nur für Domains, die es tatsächlich benötigen, um die Leistung zu erhaltenUm einen Entwicklungsserver unter http://localhost:8080 auszuführen:
echo "dev" > handlers/VERSION
RULESET="./ruleset.yaml" go run cmd/main.go
Installieren Sie air gemäß den Installationsanweisungen.
Führen Sie einen Entwicklungsserver unter http://localhost:8080 aus:
air # or the path to air if you haven't added a path alias to your .bashrc or .zshrc
Dieses Projekt verwendet pnpm, um ein Stylesheet mit den Tailwind CSS-Klassen zu erstellen. Ändern Sie bei der lokalen Entwicklung Stile in form.html, führen Sie pnpm build aus, um ein neues Stylesheet zu generieren.
| Variable | Beschreibung | Wert |
|---|
PORT | Port, auf dem der Server lauschen soll | 8080 |
PREFORK | Mehrere Serverinstanzen starten | false |
USER_AGENT | Zu emulierender User Agent | Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) |
X_FORWARDED_FOR | IP-Adresse des Weiterleiters | 66.249.66.1 |
USERPASS | Aktiviert Basic Auth, Format admin:123456 | `` |
LOG_URLS | Abgerufene URLs protokollieren | true |
DISABLE_FORM | Deaktiviert das URL-Formular auf der Startseite | false |
FORM_PATH | Pfad zu benutzerdefiniertem Formular-HTML | `` |
RULESET | Pfad oder URL zu einer Ruleset-Datei; akzeptiert lokale Verzeichnisse | https://raw.githubusercontent.com/everywall/ladder-rules/main/ruleset.yaml oder /path/to/my/rules.yaml oder /path/to/my/rules/ |
EXPOSE_RULESET | Eigenes Ruleset für andere Ladder-Instanzen bereitstellen | true |
ALLOWED_DOMAINS | Kommagetrennte Liste erlaubter Domains. Leer = keine Einschränkungen | `` |
ALLOWED_DOMAINS_RULESET | Domains aus dem Ruleset erlauben. false = keine Einschränkungen | false |
FLARESOLVERR_HOST | URL für den FlareSolverr-Dienst zum Cloudflare-Bypass (optional) | http://localhost:8191 |