Почему перенаправление PHP не работает, когда вы передаете адрес страницы через GET? - PullRequest
1 голос
/ 05 октября 2011

Вот мой код в redirect.php: (я знаю, что это непрактично)

<?php
header("Location: " . $_GET['to']);
?>

А вот и проблема. Эта страница работает и перенаправляет правильно:

redirect.php?to=http://www.google.com

Но это не так:

redirect.php?to=http://www.google.com/

Проблема не в последнем слэше, этот тоже не работает:

redirect.php?to=http://www.google.com/intl/en/about/corporate/index.html

Также не выполняет запрос GET с кодом Urlen:

redirect.php?to=http%3A%2F%2Fwww.google.com%2F

Но работают следующие ошибочные: (Обратите внимание на одну косую черту в http: /)

redirect.php?to=http:/www.google.com/
redirect.php?to=http:/www.google.com/intl/en/about/corporate/index.html

И эта ошибка вызывает ошибку 404 на моем собственном сервере, как и должно быть («Запрошенный URL www.google.com не найден на нашем сервере ...»):

redirect.php?to=www.google.com/

В Firefox ошибочные сообщения отображают «Соединение с сервером было сброшено», а в Chrome также отображается страница «Ошибка 101 (net :: ERR_CONNECTION_RESET): Соединение было сброшено». Из-за этого я не вижу, какие заголовки отправляет сервер. На самом деле кажется, что не отправляет!

Самое смешное, что все вышеперечисленные запросы работают нормально, когда я тестирую их на своем локальном хосте с помощью WampServer, но когда я загружаю их, это просто не работает! Вывод или спецификация перед заголовком отсутствуют, прокси-сервер не используется, и вся работа выполняется на порту 80. Может ли мой серверный конфиг (какой конфиг?) Источником проблемы?

Я не могу думать ни о чем другом, чтобы попробовать и поэкспериментировать.

Я уже читал некоторые проблемы с перенаправлением после отправки данных POST, но я не думаю, что это связано с этой проблемой.

EDIT:

Попытка отправки заголовков статуса 301/303 перед заголовком местоположения ... Не повезло.
Позвонил другу и попросил его проверить с другим компьютером и другим провайдером ... Не повезло.
Написал другой скрипт в кодировке ASCII (вместо utf8) ... Не повезло.

Пожалуйста, укажите мне другие тесты и диагнозы, которые я могу поставить по этому вопросу.

Ответы [ 5 ]

2 голосов
/ 05 октября 2011

это не так: redirect.php? To = http://www.google.com/

Negative.

Также не выполняет запрос GET с кодом urlen: redirect.php? To = http% 3A% 2F% 2Fwww.google.com% 2F

Negative.

Обе работы.
Вы должны отладить свой код, чтобы найти, в чем проблема.

  • Вместо перенаправления и угадывания результатов, выводит полученное значение на экран и проверяет его
  • вместо просмотра поддельных ошибок браузера вы должны смотреть фактические заголовки HTTP отправленные в браузер.

Я полагаю, что это какой-то код в redirect.php, портящий ваши данные. Что-то вроде глупой процедуры «сделать все данные безопасными сразу».

0 голосов
/ 05 октября 2011

Никогда не следует использовать необработанные входные данные для отправки заголовков, поскольку это делает ваше приложение уязвимым для атак с разделением ответов .

Вы можете найти несколько хороших примеров на веб-сайте SecuriTeam .

0 голосов
/ 05 октября 2011

Вы пытались искать какие-либо печатные символы вне тегов php? Это молча сломает ваш редирект.

Попробуйте оставить открытым тег php. это решит проблемы с пробелами после закрывающего тега php. Как то так

<?php
header("Location: " . $_GET['to']);
// no closing tag and no content after

Кроме этого, включен ли этот код в другой фрагмент кода, который мог бы что-то напечатать в html перед вызовом заголовка?

0 голосов
/ 05 октября 2011

Разве вы не можете реализовать что-то вроде этого ...

Перейдите на URL http://website.com/redirect.php?to=google.com

и затем добавьте нужные биты в URL в вашем PHP-коде, например, так::

<?php
header("Location: http://" . $_GET['to']  . '/');
?>

Вы можете попробовать кодировать URL-адрес, а затем декодировать его в своем скрипте, чтобы предотвратить аномалии

echo '<a href="redirect.php?to=' , urlencode("http://www.google.com/") , '">Click Here</a>';

, а затем декодировать его для перенаправления

<?php
header("Location: " . urldecode($_GET['to']) );
?>
0 голосов
/ 05 октября 2011

Почему бы не передать его как urlencode(base64_encode($url)), а затем перенаправить как base64_decode(urldecode($url)).

Это не решает проблему, но мне было бы интересно узнать, работает ли это (это может помочь определить основнойпроблема).

...