web-dev-qa-db-ja.com

値がない場合、URLクエリパラメータは有効ですか?

http://example.com/foo?barのようなURLは有効ですか?

私は何らかの公式なものへのリンクを探しています。単純な「はい/いいえ」の回答または事例証拠はそれを削減しません。

120
Conley Owens
  • URI RFCに有効
  • サーバー側のフレームワーク/コードで受け入れられる可能性が高い

RI RFC は、クエリ文字列の形式を強制しません。クエリ文字列には名前と値のペアが含まれることが多いことが認識されていますが、必須ではありません(たとえば、別のURIが含まれることがよくあります)。

3.4。問い合わせ

クエリコンポーネントには、パスコンポーネント(セクション3.3)のデータとともに、URIのスキームおよび命名機関(ある場合)のスコープ内でリソースを識別するのに役立つ非階層データが含まれています。 ...

...ただし、クエリコンポーネントは "key = value"ペアの形式で識別情報を運ぶためによく使用され、頻繁に使用される値の1つは別のURIへの参照であるため、...

[〜#〜] html [〜#〜] は、HTTP GETを介して送信されたフォームが、フォーム値を「?key1 = value1&key2 = value2 ...」の形式で名前と値のペアとしてエンコードすることを確立します。 (適切にエンコード)。クエリ文字列の解析は、サーバー側のコード次第です(例:Javaサーブレットエンジン)。

使用するサーバー側フレームワークがある場合、それを特定しませんが、サーバー側フレームワークはクエリ文字列が常に名前と値のペアであると想定し、そうでないクエリ文字列で窒息する可能性がありますその形式(例?bar)。独自のカスタムコードがクエリ文字列を解析する場合、クエリ文字列形式を処理することを確認するだけです。フレームワークの場合、ドキュメントを参照するか、単にテストして処理方法を確認する必要があります。

90
Bert F

それらは完全に有効です。彼らは、暴徒のメッセンジャーの後ろに静かに立つ大きな筋肉の男に相当すると考えることができます。男は名前も話もしませんが、彼の存在だけが情報を伝えます。

69
Marc B

「HTTPプロトコルを介してネットワークリソースを見つけるために「http」スキームが使用されます。このセクションでは、http URLのスキーム固有の構文とセマンティクスを定義します。」 http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

はい、疑問符の後には何でも有効です。サーバーは異なる解釈をするかもしれませんが、偶然に、いくつかの言語はそれがリストされている場合に真であるブール値として扱うことを見ることができます。

8
Jeff Ferland

はい、有効です。

パラメータが存在するかどうかを単に確認したい場合、これはその方法の1つです。

6
Oded

URI仕様

URI仕様の唯一の関連部分は、最初の_?_と最初の_#_が仕様のクエリの定義に適合することをeverythingで知ることです。 _[:/.?]_などの任意の文字を含めることができます。これは、_?bar_や_?ten+green+apples_などのクエリ文字列が有効であることを意味します。

RFC 3986ここ を見つけます

HTML仕様

isindexは、意味のあるHTML5ではありません。

これは、フォームの最初の要素としてのみ使用するためにdeprecated提供され、名前なしで送信します。

エントリの名前が「isindex」で、タイプが「text」であり、これがフォームデータセットの最初のエントリである場合、結果に値を追加し、このエントリの残りのサブステップをスキップして、次へ進みますエントリ(存在する場合)、またはアルゴリズム全体の次のステップ。

Isindexフラグは、レガシー使用専用です。適合HTMLドキュメントのフォームは、このフラグを設定してデコードする必要のあるペイロードを生成しません。

前回 isindexがサポートされていたのはHTML3でした 。 HTML5での使用は、後方互換性を容易にするためです。

ライブラリでのサポート

この形式のURIのライブラリでのサポートはさまざまですが、一部のライブラリはisindexの使用を容易にするためにレガシーサポートを提供します。

Perl RI.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。

4
Evan Carroll

有効です: WikipediaRFC 1738(3.3。HTTP)RFC 3986(3. Syntax Components) を参照してください。

3
thirtydot

isindex非推奨のマジックname HTML5から

この廃止された機能により、フォーム送信でそのような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

他のすべての回答で説明したように、チェック、特にブール値の種類については完全に有効です

名前でクエリ文字列を取得する簡単な関数を次に示します。

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);

関数がクエリ文字列を見つけられない場合、exampleQueryStringfalseになります。それ以外の場合はtrueになります。

1
M98