쿼리 문자열을 제거하고 URL 만 얻는 방법?


201

현재 페이지의 URL을 빌드하기 위해 PHP를 사용하고 있습니다. 때로는 다음 형식의 URL

www.mydomian.com/myurl.html?unwantedthngs

요청됩니다. ?결과 URL이되도록 다음과 뒤에 오는 모든 항목 (querystring) 을 제거하고 싶습니다 .

www.mydomain.com/myurl.html

내 현재 코드는 다음과 같습니다

<?php
function curPageURL() {
    $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;
}
?>

8
BTW,이를 "쿼리 문자열"이라고합니다.
— Evan Mulawski

답변:


577

strtok처음 발생하기 전에 문자열을 얻는 데 사용할 수 있습니다.?

$url = strtok($_SERVER["REQUEST_URI"], '?');

strtok()은 ?쿼리 문자열에서 하위 문자열을 직접 추출하는 가장 간결한 기술을 나타냅니다 . explode()첫 번째 요소에 액세스해야하는 잠재적으로 2 요소 배열을 생성해야하기 때문에 덜 직접적입니다.

쿼리 문자열이 누락되거나 URL에서 다른 / 의도하지 않은 하위 문자열을 잠재적으로 변경하면 일부 다른 기술이 중단 될 수 있습니다. 이러한 기술은 피해야합니다.

데모 :

$urls = [
    'www.example.com/myurl.html?unwantedthngs#hastag',
    'www.example.com/myurl.html'
];

foreach ($urls as $url) {
    var_export(['strtok: ', strtok($url, '?')]);
    echo "\n";
    var_export(['strstr/true: ', strstr($url, '?', true)]); // not reliable
    echo "\n";
    var_export(['explode/2: ', explode('?', $url, 2)[0]]);  // limit allows func to stop searching after first encounter
    echo "\n";
    var_export(['substr/strrpos: ', substr($url, 0, strrpos( $url, "?"))]);  // not reliable; still not with strpos()
    echo "\n---\n";
}

산출:

array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => 'www.example.com/myurl.html',
)
---
array (
  0 => 'strtok: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'strstr/true: ',
  1 => false,                       // bad news
)
array (
  0 => 'explode/2: ',
  1 => 'www.example.com/myurl.html',
)
array (
  0 => 'substr/strrpos: ',
  1 => '',                          // bad news
)
---

24
다시 구문 분석하기 위해 URL을 다시 작성하는 대신 $ _SERVER를 직접 사용하는 경우 +1입니다. 가능하다면 또 다른 +1을 줄 것입니다.
— ericsoco

8
죄송합니다. explode ()에 대한 인수를 반대로하면 구분 기호가 우선합니다. array_shift(explode('?',$_SERVER["REQUEST_URI"]))
— 여기에

13
다음과 같은 경우 bool (false)을 반환하지 않습니다. 문자열에 없으면 문자열을 반환합니다.
— 벤 C

4
훌륭합니다! .. ?없는 경우에도 여전히 URL을 반환합니다 .
— Harikrishnan 2012

1
@sepehr, 나는 당신이 필요로하는 것을 정확하게 수행하고 다른 것을 사용하고 그 결과를 파싱 (즉, 폭발 후 [0]을 얻음) 기능을 사용하지 말아야 할 요점을 보지 못합니다 (물론 더 나은 성능과 같은 특별한 이유가 없다면) , 불필요한 의존성 부족 등).
— RiaD

66

사용 PHP 설명서 - parse_url () 당신이 필요로하는 부품을 얻을 수 있습니다.

편집 (@Navi Gamage 사용 예)

다음과 같이 사용할 수 있습니다.

<?php
function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'];

    return $constructed_url;
}

?>

편집 (두 번째 전체 예) :

구성표가 첨부되고 통지 메시지가 표시되지 않도록 기능이 업데이트되었습니다.

function reconstruct_url($url){    
    $url_parts = parse_url($url);
    $constructed_url = $url_parts['scheme'] . '://' . $url_parts['host'] . (isset($url_parts['path'])?$url_parts['path']:'');

    return $constructed_url;
}


$test = array(
    'http://www.mydomian.com/myurl.html?unwan=abc',
    'http://www.mydomian.com/myurl.html',
    'http://www.mydomian.com',
    'https://mydomian.com/myurl.html?unwan=abc&ab=1'
);

foreach($test as $url){
    print_r(parse_url($url));
}       

돌아올 것이다 :

Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
    [query] => unwan=abc
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
    [path] => /myurl.html
)
Array
(
    [scheme] => http
    [host] => www.mydomian.com
)
Array
(
    [path] => mydomian.com/myurl.html
    [query] => unwan=abc&ab=1
)

이것은 두 번째 매개 변수없이 설명 URL을 parse_url ()을 통해 전달한 결과입니다.

그리고 이것은 다음을 사용하여 URL을 생성 한 후의 최종 결과입니다.

foreach($test as $url){
    echo reconstruct_url($url) . '<br/>';
}   

산출:

http://www.mydomian.com/myurl.html
http://www.mydomian.com/myurl.html
http://www.mydomian.com
https://mydomian.com/myurl.html

나는 그것을 읽습니다 .. php를 처음 사용하는 경우 약간 혼란스러워 coz. 위의 PHP 코드로 나를 도울 수 있습니까?
— Navi Gamage

9 행 다음에이 코드를 추가했습니다. $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?"));
— Navi Gamage

URL의 쿼리 섹션을 클레임 ...> www.mydomain.com/myurl.html?unwantedthings 결과는 괜찮습니다! > www.mydomian.com/myurl.html 완료 ...하지만 정상 URL을 함께 제공 할 때> www.mydomain.com/myurl.html 결과 nothing..Empty입니다
— 나비 Gamage

'www.mydomain.com/myurl.html'의 strrpos ()는 0 을 반환하고 (보다 정확하기 위해 부울로 캐스트 된 거짓) substr이 비어있게됩니다. 하나를 사용하십시오 : substr () OR parse_url () 둘 다 사용하는 것이 의미가 없기 때문에;)
— veritas

나는 FALSE를 int; D로 캐스팅하는 것을 의미했다.
— veritas

54

최고의 솔루션 :

echo parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

동일한 도메인에 양식을 제출하는 경우 http://domain.com 을 포함시킬 필요가 없습니다 .


parse_url은 절대 URL을 예상하므로 REQUEST_URL이 여러 개의 연속 슬래시로 시작하는 경우와 같이 경우에 따라 잘못된 결과를 얻을 수 있습니다. 그것들은 프로토콜 기준 URI로 해석됩니다.
— NikiC

16
$val = substr( $url, 0, strrpos( $url, "?"));

당신의 대답에 끈으로 묶는 녀석은 다 끝났다. 당신의 도움을위한 감사합니다 .. 그것은 URL에서 쿼리 섹션을 cleas ...
— Navi Gamage

> www.mydomain.com/myurl.html?unwantedthings 결과는 괜찮습니다! > www.mydomian.com/myurl.html 완료 ...하지만 정상 URL을 함께 제공 할 때> www.mydomain.com/myurl.html 결과 nothing..Empty입니다
— 나비 Gamage

새로운 PHP 코드 code <? php 함수 curPageURL () {$ 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"]; $ pageURL = substr ($ pageURL, 0, strrpos ($ pageURL, "?")); } $ pageURL을 반환; }?>code
— Navi Gamage

2
나는 이것이 문제에 대한 다소 달콤하고 간단한 해결책이라고 생각합니다. 많은 확장 또는 기능이 필요하지 않습니다. 나는 이것을 사용하여 현재라는 파일 이름을 얻었습니다. $ base = basename ($ _ SERVER [ 'REQUEST_URI']); $ page = substr ($ base, 0, strrpos ($ base, "?"));
— Rob

Navi가 말했듯 이이 대답은 신뢰할 수 없습니다. 3v4l.org/nhVii URL에 querystring이 없으면 전체 URL이 제거됩니다! 이 기술은 URL 구성 요소를 인식하지 않습니다. 이 답변은 바람직하지 않습니다.
— mickmackusa

9

가장 쉬운 방법

$url = 'https://www.youtube.com/embed/ROipDjNYK4k?rel=0&autoplay=1';
$url_arr = parse_url($url);
$query = $url_arr['query'];
print $url = str_replace(array($query,'?'), '', $url);

//output
https://www.youtube.com/embed/ROipDjNYK4k

이것이 가장 쉬운 방법이라는 데 동의하지 않습니다. 아니요, 굵은 글씨로 말하면 더 설득력이 없습니다. 이 답변에는 설명이 없습니다.
— mickmackusa

@mickmackusa 의견을 좀 더 자세히 설명해 주시겠습니까? 답을 어디에 설명해야합니까? 감사합니다.
— Mukesh Saxena

Stackoverflow에 대한 모든 답변에는 솔루션의 작동 방식과 이상적인 기술이라고 생각하는 이유에 대한 설명이 포함되어야합니다. 문서 링크도 환영합니다. 귀하의 솔루션을 완전히 이해하지만 다른 연구원은 그렇지 않을 수 있습니다. Code-only 답변은 수천 명의 미래 연구원을 교육 / 강화하는 데 거의 도움이되지 않기 때문에 Stackoverflow에서 가치가 낮습니다. 가장 단순하지 않은 정보 -3v4l.org/RE0GD 는 선언 된 변수가 적고 두 개 대신 한 번만 대체하기 때문에 답이 더 단순합니다. 허용되는 답변은 무엇보다 간단합니다.
— mickmackusa

또 다른 차이점은 허용 된 답변도 가능한 조각을 처리하지만 귀하의 답변은 그렇지 않다는 것입니다. 3v4l.org/ERr4V 이상은 쿼리 문자열의 왼쪽에있는 URL을 엉망으로 만들 수
— mickmackusa


4

다음과 같은 함수에서 parse_url 빌드를 사용할 수 있습니다.

$baseUrl = $_SERVER['SERVER_NAME'] . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

2

당신은 시도 할 수 있습니다:

<?php
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
?>

2

요청 경로를 얻으려면 ( 추가 정보 ) :

echo parse_url($_SERVER["REQUEST_URI"])['path']

쿼리를 제거하고 조각을 제거하려는 경우 :

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}
$i = strposa($_SERVER["REQUEST_URI"], ['#', '?']);
echo strrpos($_SERVER["REQUEST_URI"], 0, $i);

1

요청 URI에서 쿼리 문자열을 제거하려면 쿼리 문자열을 빈 문자열로 바꾸십시오.

function request_uri_without_query() {
    $result = $_SERVER['REQUEST_URI'];
    $query = $_SERVER['QUERY_STRING'];
    if(!empty($query)) {
        $result = str_replace('?' . $query, '', $result);
    }
    return $result;
}

에 잠재적 인 문제가 있다고 생각 www.example.com/myurl.html?합니다.
— Earlee

1

상대 URL과 절대 URL을 모두 다루기 때문에 아래 코드와 같은 베리타스 솔루션을 업데이트했습니다.
당신은 여기에 자신을 시도 할 수 있습니다 : https://ideone.com/PvpZ4J

function removeQueryStringFromUrl($url) {
    if (substr($url,0,4) == "http") {
        $urlPartsArray = parse_url($url);
        $outputUrl = $urlPartsArray['scheme'] . '://' . $urlPartsArray['host'] . ( isset($urlPartsArray['path']) ? $urlPartsArray['path'] : '' );
    } else {
        $URLexploded = explode("?", $url, 2);
        $outputUrl = $URLexploded[0];
    }
    return $outputUrl;
}

1

PHP 매뉴얼 주석에 따라 다음을 사용할 수도 있습니다 .

$_SERVER['REDIRECT_URL']

이것은 특정 PHP 환경에서만 작동하며 자세한 내용은 해당 페이지의 다음 주석을 따르십시오.

목적 : 현재 PHP 파일의 URL 경로 이름, path-info는 N / A이며 URL 쿼리 문자열을 제외합니다. 슬래시를 포함합니다.

주의 사항 : URL을 다시 쓰기 전입니다 (예 : 원래 호출 URL에 따라).

주의 사항 : 모든 PHP 환경에서 설정되지는 않으며 URL 재 작성 환경에서만 설정됩니다.

웹 모드에서 작동 : 예

CLI 모드에서 작동 : 아니요


0

이 시도

$url_with_querystring = 'www.mydomian.com/myurl.html?unwantedthngs';
$url_data = parse_url($url_with_querystring);
$url_without_querystring = str_replace('?'.$url_data['query'], '', $url_with_querystring);

0

쿼리 인수없이 URL을 가져 오려고한다고 가정하면 (설정되지 않은 경우) 속기 if 문을 사용하여 확인하십시오 strpos.

$request_uri = strpos( $_SERVER['REQUEST_URI'], '?' ) !== false ? strtok( $_SERVER["REQUEST_URI"], '?' ) : $_SERVER['REQUEST_URI'];

0

Laravel을 사용하는 경우 간단한 해결책은 다음과 같습니다.

Str::before($request->getRequestUri(), '?')

-3

이 시도:

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']

또는

$urrl=$_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']

1
죄송하지만 이것은 잘못되었습니다. URI는 htaccess로 다시 작성할 수 있습니다. 이로 인해 스크립트 이름은 반환되지만 현재 URI는 반환되지 않습니다.
— Hexodus

스푸핑 될 수 있으므로 위험합니다.
— tim

확인이 잘못되었습니다. index.php, prices.php, about.php와 같은 다양한 리소스에 대한 요청에서 .htaccess로 리디렉션되는 proxy.php를 작성하고 요청 된 이름에 대한 뷰를 동적으로 작성한다고 가정합니다. 이것을 사용하면, 스크립트는 원하는 원하는 리소스가 아닌 proxy.php를 항상 보게됩니다.
— Dmitry
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.