Вероятно, это простой вопрос, но я не могу найти ответа ... У меня есть PHP-скрипт с именем send.php, который делает запрос cURL для открытия внешней веб-страницы. Он выводит внешнюю страницу в браузер. Все полностью по книгам.

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);

Все, что он делает, это отправляет некоторые данные POST в сценарий обработки на внешнем сайте, а затем отображает в браузере все, что этот внешний сценарий будет отображать нормально; т.е. сообщение с подтверждением, благодарность и т. д.

Проблема в том, что мой «send.php» по-прежнему является URL-адресом, который отображается на панели навигации. Поэтому, если я щелкаю по этой странице, и ссылки используют относительные пути, он пытается добавить мой текущий путь с этими относительными путями, что, конечно же, приводит к 404. Кроме того, если на странице больше полей формы, и путь к действию представляет собой пустую строку, он попытается снова отправить эти материалы в send.php на моем сервере, что затем сгенерирует ошибки.

Как я могу сделать так, чтобы он по-прежнему отправлял данные публикации и выводил результат сценария обработки, но по-прежнему позволял пользователю перемещаться по странице вывода, как обычно? Или, если это многостраничная форма, они могут продолжить заполнение страницы 2, как если бы они только что были на этом сайте?

Заранее спасибо

Обновление: решено путем добавления этих строк в приведенный выше код:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
$response = str_ireplace('<head>', "<head><base href=\"$url\" />", $response);
echo $response;
0
Joey 9 Мар 2012 в 09:51

3 ответа

Лучший ответ

Вы можете получить URL-адрес, который разрешает curl (если вы используете FOLLOWLOCATION с curl_getinfo и CURLINFO_EFFECTIVE_URL. Вы можете добавить этот URL-адрес ко всем относительным путям. Что касается того, как определить, является ли путь относительным. ... ну ... если он начинается с '/', он абсолютен, что фактически делает его "относительным" по отношению к домену. Если он начинается со схемы, он также абсолютен и может даже вести к другому домену.

Что касается того, как на самом деле найти URL-адреса ... вы можете использовать DOMDocument::loadHTML и использовать DOMXPath, чтобы найти все теги привязки (или link, если хотите) . Подумайте, сколько денег инженеры Google получают за очистку сайта и отслеживание URL - вероятно, это не самая простая вещь в мире, которую можно сделать оптимальным образом.

1
Explosion Pills 9 Мар 2012 в 06:30

Я могу добраться сюда

$url = "http://example.com";
$url2 = "http://www.example.com";
$url3 = "https://example.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$text = curl_exec($ch);

$text = str_replace("href=\"$url","href=\"",$text);
$text = str_replace("href=\"$url2","href=\"",$text);
$text = str_replace("href=\"$url3","href=\"",$text);
$text = str_replace("href=\"","href=\"$url",$text);
echo "$text";
curl_close($ch);
1
MHowey 9 Мар 2012 в 06:29

Есть ли причина, по которой вы не можете просто публиковать свою страницу прямо на другом сервере со стороны клиента? Зачем вообще использовать cURL, если вы просто хотите перенаправить своего пользователя на другую страницу?

<form action="https://other.server.com/url" method="post">
    <!-- if the data has been previously collected and isn't being entered right now by the user... -->
    <?php foreach ($postdata as $key => $val) { ?>
    <input type="hidden" name="<?= $key; ?>" value="<?= $val; ?>">
    <? } ?>
</form>
0
Jason 9 Мар 2012 в 06:41