Передача параметров через GET на любой URL универсальным способом

#php #get

#php #получить

Вопрос:

Я 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 , игнорируя его формат?

Ответ №1:

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

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

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

Комментарии:

1. Это предпочтительный способ, если установлено расширение PECL HTTP, в противном случае http_build_query недоступен.

2. Я думал, что у него такая же зависимость, как у http_build_url. Вы правы.

Ответ №2:

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

Ответ №3:

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

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

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

Ответ №4:

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

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

Комментарии:

1. Спасибо всем. Я использовал ваши комментарии и написал небольшую функцию, которая идеально подходит для меня

Ответ №5:

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

  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 = 'amp;';

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

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

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