2010-11-23 5 views
0

Привет У меня есть следующая страница, которая устанавливает cookie с текущим URL-адресом, а также простую внешнюю ссылку.Справка по внешней ссылке PHP

<?php 

function pageURL() 
    { 
     $pageURL = 'http'; 
     if ($_SERVER["HTTPS"] == "on") 
     { 
      $pageURL .= "s"; 
     } 
     $pageURL .= "://"; 
     if ($_SERVER["SERVER_PORT"] != "80") 
     { 
      $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
     } 
     else 
     { 
      $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; 
     } 
     return $pageURL; 
    } 

    $CurrentPage = pageURL(); 

    setcookie('linkback', $CurrentPage); 

?> 

<p><a href="http://www.google.com/">External Link</a></p> 

То, что я хочу сделать, это с помощью PHP добавить префикс для всех внешних ссылок, так что они имеют следующую структуру:

localhost/outgoing?url=http://www.google.com/ 

Это загружает исходящую страницу как так:

<?php 

    if(!isset($_GET['url'])) 
    { 
     header('HTTP/1.0 404 Not Found'); 
    } 

    ?> 

<h1>Warning! Now leaving website</h1> 

    <ul> 
       <li><a title="Return to Website" href="<?php if(isset($_COOKIE['linkback'])) { echo $_COOKIE['linkback']; } else { echo 'http://localhost:8888/creathive/'; } ?>">Return to Website</a></li> 
       <li><a title="Continue to <?php echo $_GET['url']; ?>" href="<?php echo $_GET['url']; ?>">Continue to <?php echo $_GET['url']; ?></a></li> 
      </ul> 

Идея состоит в том, что с использованием файла cookie, установленного на предыдущей странице, у меня может быть простая кнопка «назад», а также захватить URL-адрес запроса и разрешить пользователю продолжать работу после того, как его предупредили, что они покидают e сайт.

Проблемы я являюсь:

1.) Приставка внешних URLS так, что они идут к исходящей странице

2.) IsSet на верхней часть уходящей страницы предполагается бросать 404, если пользователь посещает исходящую страницу без строки запроса URL, но не

3.) необходимо убедиться, что URLS действительны так, например, предотвратить это за происходящее: localhost/outgoing?url=moo

ответ

0

Вам нужно будет заменить каждый экст ernal URL в вашем коде согласно новой схеме. Невозможно сделать это автоматически для всех исходящих ссылок.

Это связано с тем, что если пользователь нажимает на внешний URL-адрес, запрос не отправляется на ваш сервер, а внешний.

Edit: Единственное, что вы могли бы сделать кэширование все свои выходные с ob_start(), а затем заменить все ссылки, используя регулярное выражение, прежде чем печатать их на своей странице.

Но лучшим решением было бы заменить все ссылки самостоятельно.

+0

Мне нравится идея OB_Start, можете ли вы показать мне, как использовать это, чтобы изменить все внешние ссылки? – Cameron 2010-11-23 13:18:28

+0

Регулярное выражение не является инструментом для использования DOM-манипуляций, в данном случае. – 2010-11-23 13:27:50

0
  1. Можете ли вы уточнить?

  2. Isset is not just the "right" tool. попробуйте arrya_key_exists ('url', $ _GET) .... Код, подобный этому, должен делать я.

function haveUrl() { 
      if (array_key_exists('url', $_GET)) { 
      $url = $_GET['url']; 
      if (!empty($url)) return true; 
     } 
     return false; 
    } 
  1. Вы можете просто проверить, если они начинаются с HTTP: // или https: // ... Это может быть сделано лучше всего с регулярным выражением .... что-то вроде ...
function validUrl($url) { 
     if (preg_match('\^(http:\/\/|https:\/\/)\mi', $url) { 
      if (preg_match('\localhost\mi', $url) return false; 
      else return trus; 
     } 
     return false; 
    } 
0

1) Я хотел бы создать класс для всех ссылок, и использовать что-то вроде $ Ссылки-> создать («HTTP: // ...») и там вы поместите переназначение и все, что вам может понадобиться.

3)

Вы можете использовать код в следующей ссылке: link text

0

1.) префиксов внешних URLS так, что они идут к исходящему странице

Вам нужно инструмент DOM для этого. Например, SimpleXML или Simple HTML DOM parser или любой из них, чтобы управлять исходящими ссылками на странице, которую вы просматриваете. (Найти больше доступных опций в this question.)

Оптимально вы будете кэшировать результаты этой операции, поскольку это может быть довольно дорого (чтение: медленное) и обновлять кешированную версию при обновлении или через определенный период времени.

2.) Исеть на верхней части уходящей страницы предполагается бросать 404, если пользователь посещает исходящую страницу без строки запроса URL, но не

Да, это делает , но вам нужно прекратить выполнение после этой точки, если вы не хотите отображать остальную часть страницы. Ошибка 404 может - и должна! - иметь тело страницы, это ответ, как любой другой ответ HTTP.

3.) не нужно, чтобы убедиться, что URLS действительны так, например, предотвратить это за происходящее: LOCALHOST/исходящий URL = мычание

Даже если вы сделаете это - и на самом деле вы должны, ничего? не позволит никому получить доступ к localhost/outgoing?url=foo с помощью ручной обработки URL-адресов. Параметры URL или любой другой пользовательский ввод никогда нельзя доверять. Другими словами, вам нужно проверить исходящий URL-адрес в исходном скрипте независимо от того, что.

И не забудьте тщательно продезинфицировать! Функциональность, такая как это, кричит, чтобы ее злоупотребляли.

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