Ответ 1
Добавляет ли добавление exit
или die();
в конец вашего PHP?
Иногда HTTP-клиентам не нравится, когда заголовок перенаправления отправляется, пока контент все еще существует в теле (даже если он пуст: пробелы, строки и т.д.)
На нашем сервере объявлений мы используем следующий простой 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
Добавляет ли добавление exit
или die();
в конец вашего PHP?
Иногда HTTP-клиентам не нравится, когда заголовок перенаправления отправляется, пока контент все еще существует в теле (даже если он пуст: пробелы, строки и т.д.)
Что произойдет, если вы используете rawurldecode($lp)
? Я тестировал в Windows 7 в IE7-10, и он отлично работает для меня (в обоих направлениях). Странно!
Проверьте URL, на который вы перенаправляетесь в IE, что говорит адресная строка?
Чтобы предотвратить проблемы с переадресацией заголовков, я обычно использую ob_start(); и ob_flush();
<?php
ob_start(); //at the top of the page//
header( $location ) ;
ob_flush();
?>
Возможно, на сервере имеется буферизация вывода. Буферизация вывода может вывести заголовок из-за буфера (как вы знаете, заголовки должны быть отправлены первыми).
Надеюсь, что это может быть проблема