Zur Navigation

Proxy mit cURL

1 Leon (Gast)

Hallo,

ich arbeite aktuell bei meiner Abschlussarbeit (B. Sc.) mit mod_rewrite und bin hier auf das gleiche Problem wie mein Vorfragesteller gekommen.

Ich möchte, dass alle Aufrufe (requests) mit allen GET- und POST-Parametern via mod_rewrite auf ein PHP-Skript weiterleiten und im Anschluss dort ausgeben. Die Weiterleitung/Anzeige funktioniert soweit auch schon, allerdings wird immer nur ein GET-Parameter übernommen sowie POST-Parameter bei bspw. Formularen ebenfalls nicht.

Meine bis jetzt erstellte .htaccess-Datei:
RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} attached$
RewriteRule .* - [L]
RewriteCond %{REQUEST_URI} ![skript]\.php
RewriteRule (.*)\.php server.php?do=http://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING} [L]

Kann mir hier jemand helfen und mir mitteilen, wie ich alle GET-Parameter sowie POST-Parameter mit weiterleite?

Danke und Grüße,
Leon

22.05.2015 15:02

2 Jörg Kruse

POST-Parameter können mit mod_rewrite nicht weitergeleitet werden.

Alternativ könntest du die POST Daten über ein PHP-Script weiterleiten, mithilfe von cURL

22.05.2015 15:37

3 Leon (Gast)

Vielen Dank für den Hinweis mithilfe von cURL!

GET-Parameter können mit mod_rewrite ja weitergeleitet werden oder?

Hier habe ich in meiner .htaccess an die entsprechende weitergeleitete URL {QUERY_STRING} angehängt.

Leider funktioniert das nur mit einem GET-Parameter. Sobald mehrere GET-Parameter angehängt sind, wird nur der erste Parameter mit übergeben.

Weiß hier jemand woran das liegen könnte?

27.05.2015 15:21

4 Jörg Kruse

Du meinst diese Rule:

RewriteCond %{REQUEST_URI} ![skript]\.php
RewriteRule (.*)\.php server.php?do=http://%{HTTP_HOST}%{REQUEST_URI}?%{QUERY_STRING} [L]

Du hast hier gewissermaßen einen Query String innerhalb eines anderen. Die & werden bereits vom äußeren Query String ("?do=...") interpretiert.

Probier mal alternativ:

RewriteCond %{REQUEST_URI} ![skript]\.php
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule (.*)\.php server.php?do=%1 [L]

Diese Lösung habe ich von hier:

http://stackoverflow.com/questions/1882694/mod-rewrite-pass-the-path-query-string-url-as-a-parameter

27.05.2015 16:15 | geändert: 27.05.2015 16:21

5 Leon (Gast)

Vielen Dank für den Link und Tipp!

Die RewriteRule funktioniert jetzt, jedoch habe ich jetzt das Ganze mal mit einer installierten WordPress Anwendung von mir getestet und kam hier zu den Erkenntnissen, dass das noch nicht ganz funktioniert.

Inhalt der modifizierten .htaccess:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} !attached
RewriteCond %{REQUEST_URI} !server\.php
RewriteCond %{THE_REQUEST} ^[A-Z]+\ ([^\s]+)
RewriteRule (.*)\.php server.php?do=%1 [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress


Anzeigen lasse ich mir die angefragte Datei dann im Ziel PHP-Skript wie folgt:
...
$ch = curl_init($URL_DES_REQUESTS);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
$PAGE = curl_exec($ch);
echo $PAGE;
curl_close($ch);

Liegt hier das Problem, dass es mit einer installierten WordPress-Anwendung bei mod_rewrite in meiner .htaccess-Datei?

Vielen Dank für die Unterstützung!

Grüße,
Leon

09.06.2015 15:09

6 Jörg Kruse

dass das noch nicht ganz funktioniert

Wie äußert sich das genau?

Was für eine URL rufst du auf - und was passiert dann (nicht)?

09.06.2015 17:42

7 Leon (Gast)

Ich hab das zunächst mit zwei einfachen formularen (GET & POST) getestet und mir dort jeweils immer nach abschicken die GET bzw. POST Parameter ausgeben lassen, was funktioniert hat.

Im Anschluss habe ich das PHP Skript, welches die Umleitungen der RewriteRule annimmt sowie die .htaccess habe ich dann zu einer installierten WordPress-Anwendung von mir hinzugefügt und konnte hier auch Beiträge und Startseite anzeigen über das Skript.

Allerdings wenn ich als url den Administrationsbereich auferufen habe, wurde nichts mehr bzw. eine leere Seite angezeigt.

09.06.2015 22:36

8 Jörg Kruse

Allerdings wenn ich als url den Administrationsbereich auferufen habe, wurde nichts mehr bzw. eine leere Seite angezeigt.

Hast du Zugriff auf den Error-Log? da sollte eine entsprechende Fehlermeldung zu finden sein (von PHP oder vom Webserver)

Dein PHP-Script funktioniert wohl wie eine Art Proxy? im Adminbereich von Wordpress müssen zur Authentifizierung auch noch Session-Cookies übermittelt werden.

10.06.2015 09:49

9 Leon (Gast)

Korrekt, mein PHP-Skript soll wie eine Art Proxy funktionieren.

Sollte ich dann beim Einsatz von cURL Session-Cookies noch aktivieren in den Optionen?

Danke und Grüße,
Leon

10.06.2015 10:12

10 Leon (Gast)

Ich habe die Optionen für den Einsatz von cURL jetzt wie folgt im PHP-Skript geändert:
    $ch = curl_init($wa->url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
    curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id());
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
    $wa->page = curl_exec($ch);

    echo $PAGE;
        
    curl_close($ch);

Jetzt kann ich beiträge kommentieren und zur Freischaltung senden, allerdings erscheint jetzt bei Aufruf des Administrationsbereiches folgende Fehlermeldung: 503 Service Temporarily Unavailable

Fehlt beim Einsatz von cURL hier in meinem Skript noch eine Einstellung?

Danke und Grüße,
Leon

10.06.2015 11:12