2009-09-18 2 views
0

У меня есть страница, которая делает XML POST-запрос URL-адресу на другом сервере (например, «http://wwww.externalserver.com/login»). Этот сервер отправляет простой HTML в качестве ответа. Проблема в том, что URL-адрес, отображаемый в браузере, все еще находится на моем локальном сервере, скажем, «http://localhost/callExternal.php». Внешний URL перенаправляет (302) на другую страницу.Изменить расположение URL-адресов в запросах CURL?

Возвращенный HTML этой целевой страницы содержит относительные пути изображения. Из-за несоответствующего URL эти относительные пути недействительны, и поэтому изображения или таблицы стилей не загружаются.

Есть ли способ сделать CURL (или любое другое решение, работающее на PHP4), изменением местоположения так, чтобы эти относительные пути работали (без разбора HTML и изменения путей)?

Это вызывающий сценарий "http://localhost/callExternal.php ":

$data = '<?xml version="1.0" encoding="UTF-8"?><Some XML></Some XML>'; 

$res = curl_init('http://wwww.externalserver.com/login'); 

curl_setopt($res, CURLOPT_POST, 1); 
curl_setopt($res, CURLOPT_HEADER, 0); 
curl_setopt($res, CURLOPT_POSTFIELDS, $data); 
curl_setopt($res, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($res, CURLOPT_HTTPHEADER, array("Content-Type: text/xml; charset=UTF-8")); 
curl_exec($res); 
curl_close($res); 

И это фрагмент возвращаемого HTML с примером ссылки:

<html> 
<head> 
<link rel="stylesheet" type="text/css" media="print" href="/css/screen.css" /> 
</head> 
<body>test</body> 
</html> 

И в URL все еще показывает" http://localhost/callExternal.php" , поэтому ссылка на панель стилей, очевидно, не работает.

ответ

1

Возможно, вы захотите вставить тег <base> внутри раздела <head> в HTML; процитировать w3schools:

<base> Тег указывает по умолчанию адрес с или цель по умолчанию для всех ссылок на странице.

<base> тег находится внутри головы элемент.


И в HTML 4 specifications:

В HTML, ссылки и ссылки на внешние изображения, апплеты, программ форма обработки, стиль листов и т.д., всегда определяется URI. Относительные URI разрешаются в соответствии с базовым URI, который может исходить из множества источников. Элемент BASE позволяет авторам указывать базовый URI документа явно.

Когда они присутствуют, базовый элемент должен появиться в секции головной части HTML- документа, перед любым элементом, который относится к внешнему источнику. Путь информация, указанная элементом BASE , влияет только на URI в документе , где появляется элемент.

Пример, приведенный выглядит следующим образом:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML> 
<HEAD> 
    <TITLE>Our Products</TITLE> 
    <BASE href="http://www.aviary.com/products/intro.html"> 
</HEAD> 

<BODY> 
    <P>Have you seen our <A href="../cages/birds.gif">Bird Cages</A>? 
</BODY> 
</HTML> 

И относительные URI»../cages/birds.GIF»будет преобразовано в:.

http://www.aviary.com/cages/birds.gif 
+0

Спасибо, я уже думал об этом, но HTML ответ не может быть изменен, так как он находится на внешнем сервере, не под моим контролем я должен иметь дело с тем, что я получил от – acme

+0

@acme: измените HTML-код после его получения на сервере, прежде чем отправлять его в браузер. – NickFitz

+0

@acme: вместо прямого вывода содержимого, которое вы получаете из вашего запроса на завивание, вам нужно извлечь его в переменную PHP (см. параметр CURLOPT_RETURNTRANSFER) ;; тогда вы можете использовать что-то вроде str_replace для этой переменной ;; и, наконец, echo его содержимое для пользователя. –

Смежные вопросы