ugrás a tartalomhoz

IE -ben a header location nem müxik

DarkHcK · 2011. Nov. 10. (Cs), 11.10
Sziasztok!

Egy OTP -s fizetést akarok integrálni, de IE alatt meghal a tudomány.
Egy session_write_close(); után akarom a felhasználót átirányítani az otp -s fizető felületre, de Internet Explorer -el nem megy.
Kód:
session_write_close();
....
header("Connection: close");
header("Location: " . '...otp url...');
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();


Minden egyéb böngészővel szépen működik.
Ez valami IE bug, vagy én rontok el valamit?

Előre is köszi a válaszokat!
Üdv
 
1

Miért zárod le a php

Hidvégi Gábor · 2011. Nov. 10. (Cs), 13.56
Miért zárod le a php munkamenetet? Milyen fejlécek mennek ki a fenti script hatására (a többi böngészőben)?
2

Egy kis változás!

DarkHcK · 2011. Nov. 10. (Cs), 14.35
Addig debug -oltam a kódot, míg nem 2 sor lett az egész.

<?php
session_start();
header('Location: http://weblabor.hu');
?>


Ez is ugyan azt eredményezi. Nem dob át a megadott url -re.
Az az érdekes, hogy local szerveren megy, viszont a rendes szerveren nem megy.
Szerintünk valami szerver beállítás lesz a baj.
5

Érdemes lenne

deejayy · 2011. Nov. 11. (P), 21.00
Érdemes lenne összehasonlítani a két lokáció phpinfo()-ját. A fentiek alapján ugyan még nekem is csak tipp, de lehet, hogy az output buffering befolyásol valamit.
3

Ismerős probléma

janoszen · 2011. Nov. 11. (P), 09.43
Ismerős a probléma, az OTP fizetési felületét próbálod integrálni. Ezzel mi is szívtunk egy darabig, aztán találtunk megoldást:

  • A hiba elsődleges oka valószínűleg az, hogy az oldalatok HTTPS kapcsolatot használ, így a Content-Length: 0 nem elegendő ahhoz, hogy az IE lezárja a kapcsolatot, mert az SSL close nem jött meg. Az SSL close pedig nem tud megjönni, mert a PHP kódod még fut a háttérben. Az IE-n kívül ezt minden más böngésző leszarja.
  • Az OTP elvárja, hogy nyitva tartsd a kapcsolatot, de van egy nem dokumentált pollozó API-juk is, amivel pl. cronjobból tudod kérdezgetni a fizetettséget. Ezzel elveszíti azt a lehetőséget, hogy hozzád visszatérve azonnal meg tudd jeleníteni a fizetettséget.
  • Megteheted azt, hogy nem használsz SSL-t az OTP-re átirányító fizető oldalra, de ez nyilván nem célja a gyakorlatnak.
  • Megteheted azt, hogy az OTP kapcsolódást a háttérben futtatod, de ehhez valamilyen megoldást kell alkalmaznod, pl. cron job, gearman, stb. és az előtérben ténylegesen lezárod a szálat. Ennek az a hátránya, hogy erősen bele kell hákolnod az IQSystes libbe.
  • Vagy használod a fastcgi_finish_request() függvényhívást a kliens kapcsolat lezárására, ami csak PHP 5.3-tól és csak a FastCGI Process Manager használatával érhető el, tehát osztott tárhelyen nem fog működni.


Ne kérdezd, mennyi időbe került ezt kidebuggolni. :) Van egy régi (mára már használaton kívüli) megoldás a háttérben futtatásra, ha érdekel megkérdezem, hogy publikálhatom-e. A frankó megoldás az utolsó.
4

Itt a nem szép megoldás

janoszen · 2011. Nov. 11. (P), 11.22
Itt a nem szép megoldás, de ha van screen parancs a szerveren, akkor működhet.

fiz3_control.php:
ob_end_clean();
//Innen illeszd be
$param = escapeshellarg(base64_encode(serialize(
array(
	"server" => $_SERVER,
	"get" => $_GET,
	"post" => $_POST,
	"request" => $_REQUEST
))));
$result = `/bin/bash ..OTP lib útvonala../backend.sh $param`;
backend.sh:
#!/bin/bash
/usr/bin/screen -d -m /usr/bin/php ..OTP lib útvonala../otpbackend.php "$1"
otpbackend.php:
#!/usr/bin/php
<?php

$arg = unserialize(base64_decode($_SERVER['argv'][1]));
$_SERVER=$arg['server'];
$_GET=$arg['get'];
$_POST=$arg['post'];
$_REQUEST=$arg['request'];

//Ide másold be az OTPSend.php tartalmát.
Mint mondottam, ez a ronda hack jellegű megoldás, ezért csak nagyon kevés ideig volt használatban. Ha lehet, mindenképpen a PHP-FPM-es megoldást kellene használni. Köszönet a DotRollnak és a DoclerWebnek a publikálási engedélyért. Ha szeretnél a szép megoldásokkal is foglalkozni, nézd meg ezeket az álláshirdetéseket.
6

Nem a legszebb..

dsge3 · 2013. Nov. 14. (Cs), 11.29
Nekem még az OTP-s példakód sem csinálta meg a redirectet IE alatt, ha nem kapcsoltam ki a gzip-et .htaccess-ben:
<FilesMatch \.php$>
    SetEnv no-gzip 1
</FilesMatch>
7

SSL

janoszen · 2013. Nov. 14. (Cs), 12.43
Se gzip, se SSL nem lehet, akkor mukodik.