URL では角括弧を使用できますか?
-
09-06-2019 - |
質問
URL に角かっこは使用できますか?
きがついた Apache Commons HttpClient (3.0.1) IOException、wget、Firefox がスローされますが、角括弧は受け入れられます。
URL の例:
http://example.com/path/to/file[3].html
私の HTTP クライアントはそのような URL に遭遇しましたが、コードにパッチを適用するか、例外をスローするか (実際には例外をスローする必要があります)、わかりません。
解決
RFC 3986 州
インターネットプロトコルリテラルアドレスであるバージョン6 [RFC3513]以降で識別されるホストは、正方形のブラケット内にIPリテラルを囲むことによって区別されます( [" and "])。これは、URI構文で四角いブラケット文字が許可される唯一の場所です。
したがって、そのような URI はエンコードされて届くはずなので、理論上は実際に公開されることはないはずです。
他のヒント
この質問が少し古いことは承知していますが、PHP では URL で配列を渡すために括弧を使用することに注意したいと思います。
http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3
この場合 $_GET['bar']
含まれます array(1, 2, 3)
.
URL を受け入れ、特殊文字が導入されたときに例外をスローしないブラウザまたは Web 対応ソフトウェアは、ほぼ確実にバックグラウンドで特殊文字をエンコードしています。中括弧、角括弧、スペースなどはすべて、競合を生じないように特別にエンコードされた表現方法を持っています。前の回答によると、これらに対処する最も安全な方法は、URL を解決しようとするものに渡す前に、それらを URL エンコードすることです。
パス名で使用できない文字は、# と ? だけです。それらは道の終わりを意味するからです。
uri rfc には決定的な答えがあります。
http://www.ietf.org/rfc/rfc1738.txt
安全ではありません:
キャラクターはさまざまな理由で安全でない可能性があります。URLが転写されたり、化石セットされたり、単語処理プログラムの治療を受けたりすると、重要なスペースが消え、取るに足らないスペースが導入される可能性があるため、スペースキャラクターは安全ではありません。文字「<」と「>」は、無料テキストでURLの周りの区切り文字として使用されているため、安全ではありません。引用マーク( "" ")は、一部のシステムでURLを区切るために使用されます。キャラクター「#」は安全ではなく、World Wide Webおよび他のシステムで使用されて、それに続く可能性のあるフラグメント/アンカー識別子からURLを区切るため、常にエンコードする必要があります。キャラクター「%」は、他のキャラクターのエンコーディングに使用されるため、安全ではありません。ゲートウェイや他の輸送エージェントは、そのようなキャラクターを変更することがあることが知られているため、他のキャラクターは安全ではありません。これらの文字は、「{"、"} "、" | "、" "、"^"、"、 "、" ["、"]、および「 `」です。
すべての安全でない文字は、常に URL 内でエンコードする必要があります。たとえば、文字「#」は、通常フラグメントまたはアンカー識別子を扱わないシステムでもURL内でエンコードする必要があります。そのため、URLがそれらを使用する別のシステムにコピーされた場合、変更する必要はありません。 URLエンコーディング。
答えは、彼らは、 すべき 16 進数でエンコードされますが、ポステルの法則を知っていると、ほとんどのものはそのまま受け入れられます。
HttpClient commons クラスを使用するには、org.apache.commons.httpclient.util.URIUtil クラス、特に encode() メソッドを調べます。これを使用して、URL を取得する前に URI エンコードします。
StackOverflow はそれらをエンコードしていないようです。
これらは明らかにすべての Web サーバーでサポートされているわけではないため、これらを URL エンコードするのが最善です。場合によっては、基準があっても全員がそれに従うわけではありません。
による URL指定, 、角括弧は有効な URL 文字ではありません。
関連するスニペットは次のとおりです。
「国民」および「句読点」のキャラクターは、どの作品にも現れないため、URLに表示されない場合があります。
ナショナル{| } | vline | [| ] | | ^ | 〜
句読点<| >
角括弧 [
そして ]
URL 内の はサポートされていないことがよくあります。
それらを次のように置き換えます %5B
そして %5D
:
コマンドラインを使用した次の例は、以下に基づいています。
bash
そしてsed
:url='http://example.com?day=[0-3][0-9]' encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
PHPの使用
rawurlencode()
またはurlencode()
<?php echo '<a href="http://example.com/day/', rawurlencode('[0-3][0-9]'), '">'; ?>
出力:
<a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
または:
<?php $query_string = 'day=' . urlencode('[0-3][0-9]') . '&month=' . urlencode('[0-1][0-9]'); echo '<a href="http://example.com?', htmlentities($query_string), '">'; ?>
お気に入りのプログラミング言語を使用して...コメントを投稿するか、この回答を直接編集して、プログラミング言語から使用する関数を追加して、この回答を拡張してください ;-)
詳細については、「 RFC 3986 URL 構文を指定します。の 付録 A についてです %-encoding
クエリ文字列内 (括弧は次のものに属します) 「ゲンデリム」 することが %-encoded
).
角括弧は安全ではないと考えられていますが、ほとんどのブラウザは角括弧を正しく解析します。ただし、角括弧を他の文字に置き換えた方がよいでしょう。