Ist es möglich, Postdaten umzuleiten?

Lesezeit: 5 Minuten

Ist es moglich Postdaten umzuleiten
Alex

Ich habe eine Website, auf der alle Anfragen stillschweigend umgeleitet werden (via .htaccess) zu index.php und dann wird PHP verwendet, um die richtige Seite anzuzeigen (durch Analysieren der REQUEST_URI).

Ich habe mich gefragt, ob es möglich ist, POST-Daten auch an eine gefälschte Adresse zu senden?

Ich habe derzeit meine Form so …

<form action="/send-mail" method="post">

Und meine .htaccess Regel ist …

# redirect mail posting to index
RewriteRule send-mail index.php?send-mail [NC,L] 

Mein index.php Schecks isset($_GET['send-mail']) was gut funktioniert.

Dies scheint jedoch alle POST-Daten zu löschen, die an ihn gesendet werden sollten.

Gibt es eine Möglichkeit, die Postdaten zu behalten? Ich möchte GET nicht verwenden, da es nicht so viele Informationen senden kann, obwohl dies bei einem einfachen Anfrageformular möglicherweise kein Problem darstellt.

Hier ist mein .htaccess zum Weiterleiten an index.php

# serve files and dirs if they exist please, otherwise send to index
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php

Versuche dies:

# redirect mail posting to index
     RewriteRule send-mail index.php?send-mail [NC,P]

“P” verhält sich wie “L”, indem es die Verarbeitung von Regeln stoppt, aber es teilt dem Modul auch mit, dass die Anforderung intakt an das Proxy-Modul weitergeleitet werden soll (was bedeutet, dass POST-Daten erhalten bleiben).

  • Beachten Sie, dass Sie das Proxy-Modul und das Proxy_http_module in den Konfigurationsdateien aktivieren müssen, damit dies funktioniert. Außerdem müssen Sie möglicherweise den absoluten Pfad zur Umschreibungsregel festlegen. Das heißt, im obigen Beispiel würden Sie verwenden RewriteRule send-mail /path/to/index/index.php?send-mail [NC,P] (oder zumindest a / vor Index)

    – Marius

    29. Januar 2010 um 14:31 Uhr

  • Wenn Sie möchten, dass der Host-Header erhalten bleibt, sollten Sie ihn auch aktivieren ProxyPreserveHost On in der Apache-Konfiguration.

    – Artjom Russakowskij

    12. August 2012 um 5:15 Uhr

  • Es scheint, dass das Proxying inzwischen auch für URLs funktioniert, wie in der Dokumentation angegeben: httpd.apache.org/docs/2.4/rewrite/proxy.html

    – Kjell

    23. April 2017 um 13:49 Uhr

  • Ich habe 3 Tage damit verbracht, herauszufinden, warum die POST-Daten nicht weitergeleitet wurden. Die [P] machte die Arbeit. Danke.

    – Jean-Francois

    26. August 2021 um 14:40 Uhr

Sie sollten in der Lage sein, einfach umzuleiten index.phpund dann in diesem Skript access $_SERVER['REQUEST_URI'] um die ursprüngliche Anfrage mit intaktem “send-mail” zu sehen.

Übrigens ist “kann nicht so viele Informationen senden” nicht der Grund, POST zu verwenden. Der Grund für die Verwendung von POST ist, dass die Anfrage Daten auf Ihrer Website ändert, anstatt einfach nur Daten abzurufen.

Angenommen, Sie setzen einen Hyperlink auf Ihrer Seite mit einer GET-Anforderung wie “/delete_user?id=1234,“ und dann folgt eine Suchmaschine unschuldig dem Link, während sie Ihre Website indexiert. Aus diesem Grund sind GET-Anforderungen nicht gut für Anforderungen, die Daten ändern.

  • Es gibt eine kleine Einschränkung darin, dass, sobald Sie eine beliebige Grenze erreicht haben (ich glaube, es sind 1024 Zeichen), die darauf folgenden Daten aus der Anfrage entfernt werden. Besonders problematisch, wenn es sich um ein Benutzereingabefeld handelt.

    – Kent Fredric

    11. Dezember 2008 um 6:24 Uhr

  • (NB: Limit ist server und Browserspezifisch, RFC sagt, es sei unbegrenzt, aber wir wissen, wie oft einige Unternehmen das lesen.)

    – Kent Fredric

    11. Dezember 2008 um 6:28 Uhr

  • +1 Ich bin etwas aufgeklärter, seit ich diese Frage gestellt habe und jetzt vollständig verstehe, dass alle Datenänderungen POST sein sollten

    – Alex

    14. August 2009 um 1:57 Uhr

Ich habe festgestellt, dass der zuverlässigste Weg die Verwendung von ist 307 Statuscode.

RewriteRule send-mail index.php?send-mail [R=307,L]

Der Statuscode 307 gibt an, dass die Anfrage mit derselben HTTP-Methode und denselben Daten wiederholt werden sollte. Also dein POST Die Anfrage wird zusammen mit ihren Daten wiederholt, wenn Sie diesen Statuscode verwenden.

Sie können feststellen, ob es sich bei der Anfrage um a POST fordern Sie auch an, falls Sie den Standard unterstützen müssen 301 Weiterleitungen für nicht POST Anfragen.

# POST requests.
RewriteCond %{REQUEST_METHOD} POST
RewriteRule send-mail index.php?send-mail [R=307,L]

# Standard GET requests.
RewriteRule send-mail index.php?send-mail [R=301,L]

Um Probleme mit einigen Proxys und Apache-Umschreibungen zu vermeiden, übergeben Sie sie POST Daten oder setzen Sie die Content-Length: 0 Header für Anfragen mit leerem Text.

Ich hatte kürzlich Probleme mit Apache beim Konvertieren meiner Anfrage in a GET wenn du a machst POST mit leerem Körper. Also statt dessen:

 curl -X POST https://example.com/api/user/123456789

passieren die Content-Length Header:

 curl -X POST https://example.com/api/user/123456789 -H 'Content-Length: 0'

oder etwas im Körper passieren:

 curl -X POST https://example.com/api/user/123456789 -d ''

Solange Sie nur ein internes Umschreiben und keine HTTP-Umleitung verwenden, sollten Sie keine POST-Daten verlieren. Hier ist die Regel, die ich auf meiner Website verwende:

RewriteRule ^(.*)$ index.php/$1 [L]

Versuchen Sie, die HTTPLiveHeaders-Erweiterung für Firefox (oder etwas Ähnliches) zu verwenden, und verfolgen Sie die gesamte Seitenanforderung. Stellen Sie sicher, dass Sie keine HTTP-Umleitung erhalten. Wenn Sie eine bekommen HTTP/1.1 3xx Antwort u Standort: http://Adresse Überschrift, das ist das Problem. Ihre Umschreibungsregel, die Sie gepostet haben, sollte dies nicht verursachen. Wenn Sie umgeleitet werden, gibt es wahrscheinlich entweder einen Fehler in Ihrem PHP-Code oder eine andere Rewrite-Regel, die angewendet wird.

  • Nein, ich bekomme 200 OK zurück :S

    – Alex

    11. Dezember 2008 um 4:11 Uhr

  • sieht aus wie der Browser verwenden wird GET für die zweite Anfrage nach der Weiterleitung…

    – Janus Troelsen

    12. Oktober 2014 um 16:28 Uhr

  • Es gibt keine zweite Anfrage mit einem Umschreiben. Nur eine Umleitung (Standort-Header und 3xx-Antwort) hat eine zweite Anfrage.

    – Mcrumley

    12. Oktober 2014 um 16:38 Uhr

Ich möchte user_login.php auf eine SEO-freundliche URL wie /user-login mit Post-Formular-Daten umleiten, und das hat bei mir funktioniert.

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/user_login\.php [NC]
RewriteRule ^ user-login [QSA,R=301]
RewriteRule ^user-login$ user_login.php [QSA,L]

In Ansichtsdatei

<form action="<?php $siteurl;?>/user-login" method="post" id="user_login">

  • Nein, ich bekomme 200 OK zurück :S

    – Alex

    11. Dezember 2008 um 4:11 Uhr

  • sieht aus wie der Browser verwenden wird GET für die zweite Anfrage nach der Weiterleitung…

    – Janus Troelsen

    12. Oktober 2014 um 16:28 Uhr

  • Es gibt keine zweite Anfrage mit einem Umschreiben. Nur eine Umleitung (Standort-Header und 3xx-Antwort) hat eine zweite Anfrage.

    – Mcrumley

    12. Oktober 2014 um 16:38 Uhr

916670cookie-checkIst es möglich, Postdaten umzuleiten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy