값이없는 경우 URL 쿼리 매개 변수가 유효합니까?


138

URL이 http://example.com/foo?bar유효합니까?

나는 어떤 식 으로든 다른 식으로 말하는 공식에 대한 링크를 찾고 있습니다. 간단한 예 / 아니오 답변이나 일화적인 증거로는 잘릴 수 없습니다.


3
URI RFC 외에도 실제 사례를 지적하고 싶습니다. Drupal은 일부 링크에서 이러한 값없는 쿼리 매개 변수를 캐시 무효화 형태로 사용합니다. 예 : www.google-analytics.com/analytics.js?o490ub 또는 /themes/seven/ie.css?o4eppb. 당신은 아마 이것을 이미 알고 있지만 이것에 걸려 넘어 질 수도 있습니다.
Elijah Lynn

답변:


103
  • URI RFC에 유효
  • 서버 측 프레임 워크 / 코드에 적합

URI RFC는 쿼리 문자열의 형식을 강제하지 않습니다. 쿼리 문자열에는 종종 이름-값 쌍이 포함된다는 점이 인식되지만 필수는 아닙니다 (예 : 종종 다른 URI를 포함 할 것).

3.4. 질문

쿼리 구성 요소에는 경로 구성 요소 (섹션 3.3)의 데이터와 함께 URI의 체계 및 명명 권한 (있는 경우) 범위 내에서 리소스를 식별하는 비 계층 데이터가 포함됩니다. ...

... 그러나 쿼리 구성 요소는 종종 "key = value"쌍의 형태로 식별 정보를 전달하는 데 사용되며 자주 사용되는 값 하나는 다른 URI에 대한 참조입니다.

HTML 은 HTTP GET을 통해 제출 된 양식이 양식 값을 "? key1 = value1 & key2 = value2 ..."형식으로 이름-값 쌍으로 인코딩해야합니다 (적절하게 인코딩 됨). 쿼리 문자열 구문 분석은 서버 측 코드 (예 : Java 서블릿 엔진)에 달려 있습니다.

사용하는 서버 측 프레임 워크를 식별 할 수는 없지만 서버 측 프레임 워크는 쿼리 문자열이 항상 이름-값 쌍에 있다고 가정하고 그렇지 않은 쿼리 문자열에서 질식 할 수 있습니다. 해당 형식으로 (예 :) ?bar. 쿼리 문자열을 구문 분석하는 고유 한 사용자 지정 코드 인 경우 해당 쿼리 문자열 형식을 처리해야합니다. 프레임 워크 인 경우 문서를 참조하거나 간단히 테스트하여 처리 방법을 확인해야합니다.


7
제공된 값이 없으면 ASP.NET MVC (버전 4 및 5 버전)가 확실히 질식합니다. (
AR

2
HTML5 의 isindex마술 name은 키-값 형식없이 쿼리 문자열을 보낼 수 있습니다. stackoverflow.com/a/37579004/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 HTML3의 레거시 지원을위한 더 이상 사용되지 않는 기능
Evan Carroll

80

그들은 완벽하게 유효합니다. 당신은 그들이 폭도 메신저 뒤에 조용히 서있는 큰 근육질의 사람과 동등한 것으로 간주 할 수 있습니다. 그 사람은 이름이없고 말도하지 않지만 그의 존재는 정보를 전달합니다.


19
폭도의 근육질 남자는 이름을 가지고 있습니다. 당신은 그것을 알지 못합니다. 당신은 그것을 매개 변수에서 알고 있으며 기본적으로 부울 값 (현재, 부재)을 가지고 있습니다.
Vlasec

2
그것을 설명하는 가장 좋은 방법 :)
Mohammad Kermani

1
큰 남자의 이름은 Cheich 딥 스페이스 9 : 스타 트렉에 그 카지노 절도 에피소드에서,
안토니 러 틀리지

8

"http"체계는 HTTP 프로토콜을 통해 네트워크 리소스를 찾는 데 사용됩니다.이 섹션에서는 http URL의 체계 별 구문과 의미를 정의합니다. " http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

예, 물음표 뒤에는 아무 것도 유효합니다. 서버가 다르게 해석 할 수도 있지만 일화 적으로 일부 언어는이를 부울 값으로 취급하는 것을 볼 수 있습니다.


6
공식적인 정의에 대해서는 RFC 2396 ( ietf.org/rfc/rfc2396.txt )을 참조하십시오 . 이는 유효한 문자 세트와 특별한 의미가있는 문자를 지정하는 것 외에 쿼리 문자열의 컨텐츠에 대해서는 자동입니다. 특히, "쿼리 구성 요소는 리소스에 의해 해석 될 정보의 문자열"이라고 말하며, 그 정의는 프로토콜에 따라 달라 지므로 key = value 는 대체로 관례에 따릅니다.
RobertB

6

예, 유효합니다.

매개 변수가 존재하는지 여부를 확인하려는 경우이를 수행하는 한 가지 방법입니다.


4

URI 사양

URI 스펙의 유일한 관련 부분은 첫 번째 와 첫 번째 사이의 모든 내용 을 쿼리의 스펙 정의에 맞추는 것입니다. 와 같은 문자를 포함 할 수 있습니다 . 이는 또는 같은 쿼리 문자열 이 유효 함을 의미 합니다.?#[:/.?]?bar?ten+green+apples

여기 에서 RFC 3986을 찾으 십시오.

HTML 사양

isindex HTML5는 의미가 없습니다.

그것은 제공하는 것 되지 않는 이름없이 단지 형태의 첫 번째 요소로 사용하고,을 제출하십시오.

항목 이름이 "isindex"이고 유형이 "text"이고 이것이 양식 데이터 세트의 첫 번째 항목 인 경우 결과 값을 추가하고이 항목의 나머지 하위 단계를 건너 뛰고 다음 항목으로 이동하십시오. 항목 (있는 경우) 또는 전체 알고리즘의 다음 단계 (그렇지 않은 경우)

isindex 플래그는 레거시 전용입니다. HTML 문서를 준수하는 양식은이 플래그 세트로 디코딩해야하는 페이로드를 생성하지 않습니다.

isindex가 마지막 으로 지원 된 시간 은 HTML3 입니다. HTML5에서 사용하면 이전 버전과의 호환성을 쉽게 제공 할 수 있습니다.

라이브러리 지원

이 형식의 URI에 대한 라이브러리 지원은 다양하지만 일부 라이브러리는 레거시 지원을 제공하여 쉽게 사용할 수 있습니다 isindex.

Perl URI.pm (특별 지원)

Perl의 URI 와 같은 일부 라이브러리는 이러한 종류의 구조를 구문 분석하는 메소드를 제공합니다.

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(특별 지원 없음)

더 빈번한 또 다른 예로, node.js일반 경로를 사용하고 다음 중 하나로 쉽게 구문 분석합니다.

  • 또는 키와 값의 객체 (을 사용하여 parseQueryString)

이와 유사한 것을 따르는 대부분의 다른 URI 구문 분석 API.



3

isindexnameHTML5에서 사용되지 않는 마술

더 이상 사용되지 않는이 기능을 사용하면 양식 제출에서 해당 URL을 생성하여 HTML에 유효한지 더 많은 증거를 제공 할 수 있습니다. 예 :

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

다음 유형의 URL을 생성합니다.

?bar

표준 : https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindex그러나 https://stackoverflow.com/a/41689431/895245 에서 언급했듯이 더 이상 사용되지 않습니다.


1

다른 모든 답변이 설명했듯이 검사, 특히 부울 종류의 항목에 완벽하게 유효합니다.

다음은 이름별로 쿼리 문자열을 가져 오는 간단한 함수입니다.

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

그리고 당신은 당신이 찾고있는 쿼리 문자열이 존재하는지 여부를 확인하고 싶다면 다음과 같은 간단한 일을 할 수 있습니다 :

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

exampleQueryString될 것입니다 false함수가 쿼리 문자열을 찾을 수없는 경우, 그렇지 않으면 될 것입니다 true.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.