21

値のない GET パラメータを使用する URL について、上司と少し口論になっています。例えば

http://www.example.com/?logout

この種のリンクは Web 上でかなり頻繁に見かけますが、もちろん、これが良いことを意味するわけではありません。彼は、これが標準ではなく、予期しないエラーが発生する可能性があることを恐れているため、次のようなものを使用することを望んでいます。

http://www.example.com/?logout=yes

私の経験では、空のパラメーターを使用して問題に遭遇したことはありません。また、それらは私にとってより意味がある場合があります (この場合のように、?logout=no意味がない場合は、「ログアウト」の値は無関係であり、私はパラメータの値ではなく、サーバー側のパラメータの存在をテストします)。(見た目もすっきりします。)

ただし、この種の使用法が実際に有効であり、実際に問題を引き起こす可能性がないという確認は見つかりません。

これに関するリンクはありますか?

4

3 に答える 3

21

RFC 2396、「Uniform Resource Identifiers (URI): Generic Syntax」、§3.4、「Query Component」は、クエリ文字列に関する信頼できる情報源であり、次のように述べています。

クエリ コンポーネントは、リソースによって解釈される情報の文字列です。

[...]

クエリ コンポーネント内では、文字「;」、「/」、「?」、「:」、「@」、「&」、「=」、「+」、「,」、および「$」は予約されています。

RFC 2616、「ハイパーテキスト転送プロトコル -- HTTP/1.1」、§3.2.2、「http URL」は、これを再定義していません。

つまり、指定したクエリ文字列 ("logout") は完全に有効です。

于 2013-01-07T10:37:22.757 に答える
7

キーを有効にするために値は必要ありません。URL の有効性が低下することもありません。URL RFC1738では、URLの必須部分としてリストされていません。

値が本当に必要ない場合は、好みの問題です。

http://example.com/?logout

と同じくらい有効な URL です。

http://example.com/?logout=yes

すべての違いは、「はい」ビットが完全に設定されていることを確認したい場合は、その値を確認できることです。お気に入り:

if(isset($_GET['logout']) && $_GET['logout'] == "yes") {
    // Only proceed if the value is explicitly set to yes

キーが URL のどこかに設定されているかどうかだけを知りたい場合はlogout、値を割り当てずにキーをリストするだけで十分です。次に、次のように確認できます。

if(isset($_GET['logout'])) {
    // Continue regardless of what the value is set to (or if it's left empty)
于 2013-01-07T10:39:10.240 に答える
3

まったく問題なく、エラーは発生しません。ただし、最近ではほとんどのフレームワークが MVC ベースであるため、URL でcontrolleractionに言及する必要があるため、より似ています/users/logout(ちなみに、StackOverflow もその URL を使用してユーザーをログアウトします;)。

エラーが発生する可能性があるという記述は、アプリケーションが raw に手動でアクセスするように聞こえます$_GETが、フレームワーク (通常は MVC スタックとルーター/ディスパッチャーを提供します) なしでアプリを構築することは、ここで本当に危険なことだと思います。

于 2013-01-07T10:37:08.533 に答える