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


138

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

私は何らかの方法で言っている何かへのリンクを探しています。単純な「はい/いいえ」の回答または事例証拠ではそれを切りません。


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データが含まれており、URIのスキームと命名機関(存在する場合)のスコープ内でリソースを識別するのに役立ちます。...

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

HTMLは、HTTP GETを介して送信されたフォームがフォーム値を "?key1 = value1&key2 = value2 ..."(適切にエンコードされた)形式の名前と値のペアとしてエンコードする必要があることを確立します。クエリ文字列の解析は、サーバー側のコード(Javaサーブレットエンジンなど)に依存します。

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


7
ASP.NET MVC(私の知る限りバージョン4と5)は、値が提供されていない場合に間違いなくチョークされます:(
AR

2
isindex魔法nameHTML5からは、キーと値のフォーマットせずにクエリ文字列を送信することができますstackoverflow.com/a/37579004/895245
チロSantilli郝海东冠状病六四事件法轮功


80

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


19
暴徒の筋肉質の男には名前があり、あなたはそれを知らないだけです。あなたはそれをパラメータで知っています、そしてそれは基本的にブール値(存在、不在)を運びます。
Vlasec

2
それを説明する最良の方法:)
Mohammad Kermani 2017

1
ビッグガイの名前はCheichで、スタートレックのカジノ強盗エピソード:Deep Space 9から
Anthony Rutledge

8

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

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

だから、はい、疑問符の後は何でも有効です。サーバーの解釈は異なる場合がありますが、事例によっては、一部の言語ではそれがブール値として扱われ、リストされている場合はtrueであることがわかります。


6
正式な定義については、RFC 2396(ietf.org/rfc/rfc2396.txt)を参照してください。RFC2396は、有効な文字セットと特別な意味を持つ文字セットを指定する以外は、クエリ文字列の内容については触れていません。具体的には、「クエリコンポーネントはリソースによって解釈される情報の文字列」であり、その定義はプロトコルに依存しているため、key = valueは主に慣例によるものです。
RobertB 2010

6

はい、有効です。

パラメータが存在するかどうかを確認するだけの場合は、これが1つの方法です。


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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.