쿼리 문자열을 제거하고 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.