#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
и если я сделаю header("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;
}
Похоже, для меня это идеально. Спасибо всем.