Передача параметров через GET на любой URL универсальным способом - PullRequest
1 голос
/ 24 мая 2011

Мне дали back_url извне.Мне нужно сгенерировать хеш и сделать перенаправление на этот back_url с этим параметром: header("Location: $back_url?hash=123sdf").Но проблема в том, что я не знаю формат back_url.

  • Это может быть www.example.com, и я делаю header("Location: $back_url/?hash=123sdf") sj, это хорошо.
  • Это может бытьwww.example.com/?param=value и если я сделаю h eader("Location: $back_url/?hash=123sdf"), это неправильно, потому что это будет www.example.com/?param=value/?hash=123asd.

И так далееВопрос в том, каков универсальный способ передачи параметров в back_url, игнорируя его формат?

Ответы [ 5 ]

5 голосов
/ 24 мая 2011

Сложный, но очень чистый способ

  • Используйте parse_url() для извлечения строки запроса (если есть) из URL в массив
  • Добавить hash к результирующему массиву: $params["hash"] = "1234";
  • Используйте http_build_query(), чтобы склеить параметры обратно в строку запроса
  • Возьмите все компоненты, возвращаемые parse_url(), и склейте их обратно в полный URL

Следует отметить, что это разбивает URL-адреса на его компоненты и склеивает их вместе, поэтому, скорее всего, он не будет работать с URL-адресами, которые изначально не работают.

1 голос
/ 24 мая 2011

Если у вас есть расширение PECL HTTP, используйте http_build_url :

$url = '...';
$hash = '...';
$new_url = http_build_url($url, array('hash' => $hash), HTTP_URL_JOIN_QUERY);

Если у вас нет http_build_url, вы можете использовать parse_url , чтобы найти различные части URL-адреса. Тогда это просто вопрос их склеивания. Вот решение в руководстве, которое может быть адаптировано к вашим потребностям.

1 голос
/ 24 мая 2011

Вы пробовали использовать http://php.net/manual/en/function.parse-url.php?

0 голосов
/ 27 мая 2011

Написал эту функцию:

 private function addUrlParam(array $params, $url){
    $parsed = parse_url($url);
    if(!isset($parsed['query']))
    {
        $slash = '';
        if(substr($url, -1) !== '/')
            $slash = '/';
        $start_with = $slash.'?';
    }
    else
        $start_with = '&';

    $scheme = '';
    if(!isset($parsed['scheme']))
        $scheme = 'http://';

    $query = http_build_query($params);
    return $scheme.$url.$start_with.$query;
}  

Похоже, это идеально для меня.Спасибо всем.

0 голосов
/ 24 мая 2011

Что ж, вам нужно определить, есть ли у $back_url другие параметры запроса (или переменные GET), и добавить свой хэш, используя ?hash=123asd, если его нет, или с помощью &hash=123asd, если действительно он имеет параметры запроса.

Если вы знаете, что $back_url является полным URL-адресом, таким как http://whatever.com/blah/blah (важной частью является http://whatever.com, вы можете использовать parse_url, чтобы получить все компоненты, а затем продолжить с ответом Пекки. Если ваш $back_url не начинается с http://..., тогда добавьте правильное значение (я предполагаю http://$_SERVER['host'] и, опять же, продолжите с ответом Пекки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...