Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] redirect z danymi POST
Forum PHP.pl > Forum > PHP
Cezar708
Cześć,

mam skrypt pod lokalizacją: http://localhost/home.php w pliku home.php zrobić redirect na localizację http://innyserwer/odbierz.php ale jednocześnie dane muszą być przesłane POSTem.

próbowałem następującej metody:

  1. <?php
  2. function redirectByPOSTMethod($url, $datas) {
  3.    preg_match('///(w+)(/.+)/', $url, $m);
  4.    $host = $m[1];
  5.    $path = $m[2];
  6.    $data = urlencode(http_build_query($datas));
  7.    header("POST $path HTTP/1.1r\n");
  8.    header("Host: $hostr\n" );
  9.    header("Content-type: application/x-www-form-urlencodedr\n");
  10.    header("Content-length: " . strlen($data) . "r\n");
  11.    header("Connection: closer\nr\n");
  12.    header($data);
  13.  }
  14.  
  15. redirectByPOSTMethod('http://innyserwer/odbierz.php', array('asdf'=>'1234', 'asdf1234'=>'asf'));
  16. ?>


niestety firefox zamiast przejść na serwer próbuje zapisać plik :|

co zrobić aby nastąpił normalny redirect...

Pozdrawiam
Cezar708
sowiq
Twoja metoda wysyła nagłówki z serwera do przeglądarki. A Ty musisz zrobić to w drugą stronę.

Szczerze mówiąc to wątpię, czy ze względów bezpieczeństwa przeglądarka pozwoli Ci na przekierowywanie danych POST. Ale próbuj - pewnie jakieś rozwiązanie jest. Nie mniej jednak Twoje jest z założenia błędne.
Cezar708
sowiq wszystko wskazuje, że faktycznie masz rację... nie mniej nie wierzę, że nie ma możlwości przekierowania danych z POST na inną lokalizację.

Przecież skoro:
  1. <?php
  2. header("Location: nowa.lokalizacja.php?z_danymi=get-dziala");
  3. ?>


to dlaczego nie możnaby było tego robić również z POST?

Musi być jakieś w miarę normalne rozwiązanie...
Spawnm
można ale raczej nie header winksmiley.jpg
poczytaj np o cURL:
http://wortal.php.pl/wortal/artykuly/php/b...http/formularze
sowiq
Cytat(Cezar708 @ 24.03.2009, 10:04:12 ) *
to dlaczego nie możnaby było tego robić również z POST?
Bo mówisz przeglądarce: przejdź teraz na adres domena.com/?dane_get. I tak na prawdę dla przeglądarki te dane GET to nic innego jak część adresu.

Dane POST znajdują się w nagłówkach wysyłanych przez przeglądarkę. A czy możesz zmusić przeglądarkę do ich wysłania? Nie wiem. Raczej nie, bo byłaby to poważna luka w bezpieczeństwie.

Jeśli już, to nie PHP, tylko coś co działa po stronie przeglądarki. Czytaj: JavaScript/AJAX. Ajaxem można przecież wysyłać dane POST.
Cezar708
Spawnm niestety cURL nie załatwi mojego problemu, ponieważ co najwyżej jestem w stanie wysłać request do "innyserwer/odbierz.php" i obsłużyć mi go w "localhost/home.php", więc nie ma tutaj żadnego przekierowania. Nie będę na "innyserwer/odbierz.php" tylko nadal w "localhost/home.php".

sowiq tak samo Twoje rozwiązanie nie załatwia mojego problemu... bo mam podwójny request od przeglądarki co jak wiadomo nie sprzyja ogólnie pojętemu "User Experience", więc trochę to może pomulić.

No cóż niestety chyba nie da się z tym nic ciekawego zrobić, szukałem na innych forach i trafiłem na post Is it possible to send POST vars through a header redirect?, co chyba ukręca łeb sprawie.

No nic, czeka mnie więc gimnastyka artystyczna z udziałem PHP aby ten problem ominąć.

pozdrawiam
Cezar708

[EDIT] no chyba, że macie jeszcze jakieś pomysły...
sowiq
Pytanie tylko - po co? smile.gif

Załóżmy, że chcesz zobaczyć jakie dane user wysyła POST'em i gdzieś je zapisać. Ja bym zrobił to zupełnie inaczej niż Ty zakładasz:
1. Mam formularz z action ustawionym na localhost i target'em na ramkę (oczywiście w dokumencie mam ukrytą ramkę iframe, 1x1px).
2. Klikam submit formularza - w mojej ramce ładuje się localhost - odczytuję sobie na serwerze wysłane dane
3. Po odczytaniu potrzebnych danych odbieram w ramce wygenerowany na serwerze kod JS
4. Kod JS w nadrzędnej ramce znajduje formularz (np. po ID), zmienia mu action na google.pl i wywołuje na nim metodę submit().
5. Tym sposobem masz dane POST wysłane na swój serwer, a user jest na stronie google.pl

Ew. można to zrobić bardziej elegancko - wysyłać dane na Twój serwer za pomocą Ajax. Ale w obu przypadkach user musi mieć obsługę JS. No ale nie oszukujmy się - 99% użytkowników ją ma.

Proste jak barszcz winksmiley.jpg
Cezar708
Cytat(sowiq @ 24.03.2009, 10:50:39 ) *
Załóżmy, że chcesz zobaczyć jakie dane user wysyła POST'em i gdzieś je zapisać. Ja bym zrobił to zupełnie inaczej niż Ty zakładasz:


źle zakładasz, nie chcę oglądać jakie dane przesyłane postem, a sam chcę zbudować requesta postem, i to nie na podstawie danych otrzymanych od użytkownika, więc poniższa rada:
Cytat(sowiq @ 24.03.2009, 10:50:39 ) *
1. Mam formularz z action ustawionym na localhost i target'em na ramkę (oczywiście w dokumencie mam ukrytą ramkę iframe, 1x1px).
2. Klikam submit formularza - w mojej ramce ładuje się localhost - odczytuję sobie na serwerze wysłane dane
3. Po odczytaniu potrzebnych danych odbieram w ramce wygenerowany na serwerze kod JS
4. Kod JS w nadrzędnej ramce znajduje formularz (np. po ID), zmienia mu action na google.pl i wywołuje na nim metodę submit().
5. Tym sposobem masz dane POST wysłane na swój serwer, a user jest na stronie google.pl

... traci na wartości

Cytat(sowiq @ 24.03.2009, 10:50:39 ) *
Ew. można to zrobić bardziej elegancko - wysyłać dane na Twój serwer za pomocą Ajax. Ale w obu przypadkach user musi mieć obsługę JS. No ale nie oszukujmy się - 99% użytkowników ją ma.

Nawet jakbyśmy się zrozumieli to musisz wiedzieć, że takie eleganckie nigdy nie zadziała. Wcześniej mówiłeś o bezpieczeństwie to musisz wiedzieć, że pomiędzy dwoma różnymi domenami nie wywołasz "ajaxowego" requesta. Dlaczego? Myślę, że szybko sam sobie odpowiesz.

Cytat(sowiq @ 24.03.2009, 10:50:39 ) *
Proste jak barszcz winksmiley.jpg

... niekoniecznie... to jest niestety niewykonalne.

Jedyne co mógłbym zrobić to ukryty formularz po stronie widoku, ale do niego nie mam dostępu (stąd inna domena... nie moja). Użytkownicy tej - nie-mojej domeny wysyłaja do mnie normalnie GETem dane. Ja określam wszelkie potrzebne mi dane, na tej podstawie tworzę dane, które muszę wysłać jeszcze do innego serwera...

... więc niestety pozostała mi jedyna opcja, utworzenia formularza i jego automatyczny submit, podobna do tej co sam napisałeś w jednym z wcześniejszych postów. Niestety nic innego lepszego nie byłem w stanie wymyśleć.

Pozdrawiam
Cezar708
sowiq
Cytat(Cezar708 @ 24.03.2009, 12:57:41 ) *
źle zakładasz, nie chcę oglądać jakie dane przesyłane postem, a sam chcę zbudować requesta postem, i to nie na podstawie danych otrzymanych od użytkownika
Wiesz, nie napisałeś tego wcześniej.

Nic nie stoi na przeszkodzie, żebyś na podstawie danych wysłanych na Twój serwer przez Ajaxa zbudował formularz (w HTML), wrzucił go do drzewa DOM stronki i zasubmitował JS'em po stronie użytkownika. Moim zdaniem jest to całkiem dobre rozwiązanie. Ale jak uważasz, tak zrobisz.

Pozdrawiam.
erix
A jaki problem wygenerować unikalny identyfikator, wrzucić formularz w sesję i przekazać via GET ten identyfikator? Dane będą, zadziała przez JS. winksmiley.jpg
rzymek01
a czemu uparłeś się że nie można przekazać dane przez GETa?

możesz zserializowac dane i wrzucic w GETa, nastapnie na inny serwer, który odbierze te dane i szybko z długiego adresu przeniesie przez [301] na ładny adres tongue.gif

PS. z sesjami mi się to nie widzi
erix
Cytat
PS. z sesjami mi się to nie widzi

Niby czemu? winksmiley.jpg Ale oczywiście, tylko w ramach jednego serwera.

GET ma ograniczenie do 1024 znaków...
sowiq
Cytat(rzymek01 @ 24.03.2009, 22:10:36 ) *
a czemu uparłeś się że nie można przekazać dane przez GETa?
Z tego co ja zrozumiałem, to ma to działać następująco:
1. wysyłamy jakieś zapytanie do naszego serwera (GET/POST/whatever)
2. nasz serwer parsuje to zapytanie i wysyła odpowiedź
3. po odebraniu odpowiedzi przeglądarka wysyła POST'em otrzymane przed chwilą jakieś dane na całkiem inną stronę

Jak dla mnie jedynym wyjściem jest zasubmitowanie przez JS kjakiegoś ukrytego formularza, bo nie da się tak przekierować przeglądarki, żeby automatycznie wysłała żądanie POST. M.in. ze względów bezpieczeństwa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.