Переадресация случайного сбоя в IE 8 и старше

На нашем сервере объявлений мы используем следующий простой PHP script для перенаправления на целевую страницу объявления:

<?php
$lp=array_key_exists('lp',$_REQUEST)?trim($_REQUEST['lp']):"";
$location = sprintf('Location: %s', $lp ) ;
header( $location ) ;
?>

script принимает свой параметр lp и перенаправляет на этот URL. Цель состоит в том, чтобы мы могли сканировать наш журнал доступа для отслеживания кликов (URL-адрес также включает параметр id, который игнорирует script).

У нас есть один клиент (которого я знаю до сих пор), где это не работает последовательно, но только в IE 8 и старше. URL с проблемой:

http://webutil.bridgebase.com/v2/ad_lp.php?id=340&lp=http%3A%2F%2Ftravelinsingles.com%2Fhome.htm

Это должно быть перенаправлено на http://travelinsingles.com/home.htm, но иногда оно переходит в http://webutil.bridgebase.com/home.htm (что doesn не существует). Кажется, что это происходит при первом нажатии на объявление; иногда последующие клики следуют за перенаправлением правильно, иногда они продолжают идти по плохому URL-адресу.

Я выполнил захват пакетов на нашем веб-сервере, похоже, мы отправляем правильный заголовок:

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.2.1
Date: Thu, 06 Jun 2013 01:39:12 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP/5.4.15-1
Location: http://travelinsingles.com/home.htm

Я захватил как неудачную, так и успешную переадресацию, а заголовки были идентичны, кроме даты.

Я использую Mac, поэтому я использую BrowserStack для тестирования IE, что ограничивает мою способность отладки на стороне клиента. Кто-нибудь знает, что может быть причиной этого, и если есть что-то, что мы можем сделать, чтобы обойти это?

Я воспроизвел проблему с функцией скриншотов BrowserStack:

http://www.browserstack.com/screenshots/3659c3b992a1738594d2fd370caef2852fecb3fa

Ответ 1

Добавляет ли добавление exit или die(); в конец вашего PHP?

Иногда HTTP-клиентам не нравится, когда заголовок перенаправления отправляется, пока контент все еще существует в теле (даже если он пуст: пробелы, строки и т.д.)

Ответ 2

Что произойдет, если вы используете rawurldecode($lp)? Я тестировал в Windows 7 в IE7-10, и он отлично работает для меня (в обоих направлениях). Странно!

Проверьте URL, на который вы перенаправляетесь в IE, что говорит адресная строка?

Ответ 3

Чтобы предотвратить проблемы с переадресацией заголовков, я обычно использую ob_start(); и ob_flush();

<?php
ob_start(); //at the top of the page//


header( $location ) ;
ob_flush();
?>

Ответ 4

Возможно, на сервере имеется буферизация вывода. Буферизация вывода может вывести заголовок из-за буфера (как вы знаете, заголовки должны быть отправлены первыми).

Надеюсь, что это может быть проблема