Скрытие части url-адреса в Zend Framework

Я думал, есть ли способ скрыть часть url в PHP/ Zend Framework 2. Что-то вроде этого:

sitename.com/something/?inviter=1234&id=1

Но я хотел бы скрыть часть с & id=1 каким-то образом, чтобы, когда url копируется и вводится пользователем, это выглядело бы так:

sitename.com/something/?inviter=1234

А с другой стороны я могу сделать что-то вроде этого:

$id = $_GET["id"])

Возможно ли это сделать, если да, то как? Может быть, есть что-то близкое к тому, что я ищу, чтобы достичь?

2 ответа

  1. Вы можете скрыть его только с помощью Cookie или методов сеанса. Но он будет работать только для одного пользователя в течение одного сеанса.

  2. Вы можете анализировать и перестраивать url-адрес с помощью parse_url, http_build_url, с помощью parse_str и http_build_str .

    Например:

    /**
     * Transform a url using a whitelist of query-string keys
     */
    function transformUrlKeepQueryKeys($url, array $whitelist)
    {
        // Break the given url into parts
        $parts = parse_url($url);
    
        // Break the parts into key-value pairs
        $query = $parts['query'];
        parse_str($query, $queryParts);
    
        // Unset all unwanted keys
        foreach (array_keys($queryParts) as $k) {
            if (!in_array($k, $whitelist)) {
                unset($queryParts[$k]);
            }
        }
    
        // rebuild the url
        $parts['query'] = http_build_query($queryParts);
    
        // return
        return http_build_url('', $parts);
    }
    

    Вызов должен быть:

    $url = 'http://sitename.com/something/?inviter=1234&id=1';
    $whitelist = [
        'inviter'
    ];
    $expectedUrl = 'http://sitename.com/something/?inviter=1234';
    $actualUrl = transformUrlKeepQueryKeys($url, $whitelist);
    assert($expectedUrl == $actualUrl);
    

    Кроме того, вы можете реализовать что-то подобное, используя черный список ключей для удаления.

    Единственная проблема с этим заключается в том, что функция http_build_urlне входит в ядро PHP, но является частью расширения PECL HTTP. Если вы не можете установить это расширение в своей среде, то вы можете использовать чистую реализацию PHP этой функции, например здесь .