programing

GET 인수가 없는 요청 문자열

bestprogram 2023. 8. 30. 21:51

GET 인수가 없는 요청 문자열

GET 인수 없이 요청한 파일이나 디렉터리를 가져오는 간단한 방법이 있습니까?들어 이 "URL"인 http://example.com/directory/file.php?paramater=value저는 그냥 돌아오고 싶습니다.http://example.com/directory/file.php저는 간단한 색인이 없다는 것에 놀랐습니다.$_SERVER[]하나 놓쳤나요?

편집: @T.Todua는 parse_url을 사용하여 질문에 대한 새로운 답변을 제공했습니다.

(해당 답변을 더 잘 볼 수 있도록 투표해 주십시오.

편집2: 누군가가 스킴 추출에 대해 스팸과 편집을 해왔기 때문에, 저는 그것을 맨 아래에 추가했습니다.

parse_url 솔루션

가장 간단한 솔루션은 다음과 같습니다.

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

php에서 parse_url을 특정 구성 요소를 추출하는 이 유일한 입니다.PATH 번째 에 있는 것 (번째이모든것첫의전것모첫든thing▁(▁before▁the의이전▁first)?에 대한 새로운 의" 해결책입니다 이와 같이, 이 문제에 대한 저의 새로운 "최선의" 해결책입니다.

스트록 용액

스택 오버플로:쿼리 문자열을 제거하고 URL만 가져오는 방법은 무엇입니까?

처음 발생하기 전에 strtok을 사용하여 문자열을 얻을 수 있습니까?

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

성능 참고:이 문제는 폭발물을 사용하여 해결할 수도 있습니다.

  • 폭발은 단일 구분 기호에서만 문자열을 분할하는 경우에 더 잘 수행되는 경향이 있습니다.
  • Strtok은 여러 구분 기호를 사용하는 경우에 더 잘 수행되는 경향이 있습니다.

문자열의 모든 것을 문자의 첫 번째 인스턴스 전에 반환하는 strtok의 이 응용 프로그램은 쿼리 문자열을 메모리에 남기기는 하지만 PHP의 다른 어떤 방법보다 더 잘 수행될 것입니다.

및 계(http/https)에 »$_SERVER선수단

OP가 그것에 대해 묻지는 않았지만, 언급할 가치가 있다고 생각합니다: parse_url은 URL에서 특정 구성 요소를 추출하는 데 사용되어야 합니다. 해당 함수에 대한 설명서를 참조하십시오.

parse_url($actual_link, PHP_URL_SCHEME); 

여기서 주목할 점은 요청에서 전체 URL을 가져오는 것은 사소한 작업이 아니며 많은 보안 영향을 미친다는 것입니다.$_SERVER변수는 여기서 당신의 친구이지만, apache/nginx 구성, php 환경, 심지어 클라이언트도 이러한 변수를 생략하거나 변경할 수 있기 때문에 변덕스러운 친구입니다.이 모든 것은 이 질문에 대한 범위를 벗어났지만, 다음과 같이 철저히 논의되었습니다.

https://stackoverflow.com/a/6768831/1589379

주의할 점은 다음과 같습니다.$_SERVER(" 수는 실중엔의채런변워다니집에타임해진에인행▁variables채변다▁are니워집▁populated,▁is")./var/run/php/또는/etc/php/[version]/fpm/. 이로, 엔진으로 각 및 이 변수들은 OS에서 웹서버(apache/nginx)로, php 엔진으로 전달되며, 각 단계에서 수정 및 수정됩니다.신뢰할 수 있는 유일한 변수는 다음과 같습니다.REQUEST_URIRFC 3875(PHP: $_SERVER 참조)에 나열된 것은 웹 서버에 필요하기 때문입니다.

참고: 다른 질문에 대한 답변에 대한 링크를 스팸으로 표시하는 것은 좋지 않습니다.

사용할 수 있습니다.$_SERVER['REQUEST_URI']요청한 경로를 가져옵니다.그런 다음 매개 변수를 제거해야 합니다.

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);

그런 다음 호스트 이름과 프로토콜을 추가합니다.

echo 'http://' . $_SERVER['HTTP_HOST'] . $uri_parts[0];

프로토콜도 감지해야 합니다, 만약 당신이 혼합한다면.http:그리고.https://당신을 위한 운동으로 남겨둔다는 것. $_SERVER['REQUEST_SCHEME']프로토콜을 반환합니다.


이 모든 것을 종합하면:

echo $_SERVER['REQUEST_SCHEME'] .'://'. $_SERVER['HTTP_HOST'] 
     . explode('?', $_SERVER['REQUEST_URI'], 2)[0];

...예를 들어 다음과 같습니다.

http://example.com/directory/file.php


php.com 설명서:

  • $_SERVER 서버 및 실행 환경 정보
  • explode 문자열로 문자열 분할
  • parse_url URL을 구문 분석하고 해당 구성 요소를 반환합니다(더 나은 솔루션일 수 있음).

솔루션:

echoparse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);

다음은 다양한 포트와 https를 고려한 솔루션입니다.

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';

if ($_SERVER['SERVER_PORT'] != '80')
  $pageURL .= $_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['PHP_SELF'];
else 
  $pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];  

또는 다른 포트를 고려하지 않는 보다 기본적인 솔루션:

$pageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' : 'http://';
$pageURL .= $_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']; 

저는 사실 그것이 그것을 해석하는 좋은 방법이 아니라고 생각합니다.깨끗하지 않거나 주제에서 좀 벗어났습니다.

  • 폭발은 무겁습니다.
  • 세션이 무겁습니다.
  • PHP_SELF가 URL 다시 쓰기를 처리하지 않습니다.

전 그런 걸 할 수 있을 것입니다.

if ($pos_get = strpos($app_uri, '?')) $app_uri = substr($app_uri, 0, $pos_get);
  • 이는 실제 '?'(GET 표준 형식)가 있는지 여부를 감지합니다.
  • 괜찮으면 데이터를 가져오기 위해 예약된 '?' 앞에 변수를 잘라냅니다.

$app_uri를 제 웹 사이트의 URI/URL로 간주합니다.

$uri_parts = explode('?', $_SERVER['REQUEST_URI'], 2);
$request_uri = $uri_parts[0];
echo $request_uri;

사용할 수 있습니다.$_GET params url 매개 또수는변의 경우$_POST params, 포트파 경우의람, 만지하.$_REQUEST에는 의매변포있습다니어의 매개 가 포함되어 .$_GET $_POST그리고.$_COOKIEURI 파라미터를 사용자에게 숨기려면 다음과 같이 세션 변수로 변환할 수 있습니다.

<?php

session_start();
if (isset($_REQUEST['param']) && !isset($_SESSION['param'])) {

    // Store all parameters received
    $_SESSION['param'] = $_REQUEST['param'];

    // Redirect without URI parameters
    header('Location: /file.php');
    exit;
}
?>
<html>
<body>
<?php
  echo $_SESSION['param'];
?>
</body>
</html>

편집

사용하다$_SERVER['PHP_SELF'] 또는 현재파가거나져오이을을 $_SERVER['REQUEST_URI']된 URI .

모든 사람이 쉽게 생각하는 것은 아니지만, 저는 이것이 이 문제를 해결하는 가장 좋은 방법이라고 생각합니다.

preg_match('/^[^\?]+/', $_SERVER['REQUEST_URI'], $return);
$url = 'http' . ('on' === $_SERVER['HTTPS'] ? 's' : '') . '://' . $_SERVER['HTTP_HOST'] . $return[0]


문자열의 처음부터 REQUEST_URI를 통과한 다음 "?"에 도달하면 중지합니다(이는 실제로 매개 변수에 도달할 때만 발생해야 함).

그런 다음 url을 생성하여 $url에 저장합니다.
$url을 생성할 때...우리가 하고 있는 것은 단순히 "https"를 쓴 다음, https가 사용되고 있는지 확인하는 것입니다. 그렇다면 "s"를 쓴 다음, "://"를 연결하고, HTTP_HOST(서버, fx: "stackoverflow.com ")를 연결하고, 이전에 발견한 $return을 연결합니다. (이것은 배열이지만, 첫 번째 인덱스만 필요합니다...정규식에서 문자열의 시작 부분부터 확인하므로 인덱스는 하나만 있을 수 있습니다.).

누군가 이것을 사용할 수 있기를 바랍니다.

PS. SLIM을 사용하여 URL을 재라우팅하는 동안 작동하는 것으로 확인되었습니다.

이 게시물이 오래된 게시물인 것은 알지만 저도 같은 문제를 겪고 있고 저는 이 방법으로 해결했습니다.

$current_request = preg_replace("/\?.*$/","",$_SERVER["REQUEST_URI"]);

또는 동등하게

$current_request = preg_replace("/\?.*/D","",$_SERVER["REQUEST_URI"]);

7년이 지난 지금, 얼마나 많은 이들의 투표/승인된 답변이 불완전한지, 그래서 그들은 OP의 질문에 대답하지 않는다는 것은 충격적입니다!

  • 같은 :http://example.com/directory/file.php?paramater=value

  • 은 그냥 돌아오고 : ...그리고 당신은 단지 다음과 같이 돌아가고 싶습니다.http://example.com/directory/file.php

  • 다음을 사용합니다.

    echo $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'];

왜 이렇게 복잡하죠? =)

$baseurl = 'http://mysite.com';
$url_without_get = $baseurl.$_SERVER['PHP_SELF'];

이것은 정말로 그것을 할 것입니다, 친구;)

제가 홈페이지로 다시 링크를 원했을 때도 같은 문제가 있었습니다.시도해봤는데 효과가 있었습니다.

<a href="<?php echo $_SESSION['PHP_SELF']; ?>?">

마지막에 물음표를 적어둡니다.나는 그것이 기계가 코더를 대신하여 생각하는 것을 멈추도록 한다고 믿습니다 :)

언급URL : https://stackoverflow.com/questions/9504608/request-string-without-get-arguments