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_URI
RFC 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 설명서:
솔루션:
echo
parse_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
그리고.$_COOKIE
URI 파라미터를 사용자에게 숨기려면 다음과 같이 세션 변수로 변환할 수 있습니다.
<?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
'programing' 카테고리의 다른 글
SQLAlchemy를 사용하여 MySQL에서 db를 만드는 방법은 무엇입니까? (0) | 2023.08.30 |
---|---|
MariaDB 이달의 첫째 날 찾기 및 UTC로 변환 (0) | 2023.08.30 |
XDomainRequest 또는 ActiveXObject('Microsoft.XMLHTTP') (0) | 2023.08.30 |
지정된 값이 처음 나타날 때까지 모든 행 선택 (0) | 2023.08.25 |
파일에 대한 모든 Pylint 경고 사용 안 함 (0) | 2023.08.25 |