URLにスペースを含めることはできますか?


132

URI(具体的にはHTTP URL)に1つ以上のスペース文字を含めることはできますか?URL エンコードするがある+単に一般的な慣習に従っているか、それとも正当な代替案ですか?

特に、スペースのあるURLはエンコードする必要があることを示すRFCを誰かが指摘できますか?

質問の動機: Webサイトのベータテスト中に、一部のURLにスペースが含まれていることに気付きました。Firefoxは正しいことをしているようだったので、驚いた!しかし、開発者がRFCを参照できるようにして、開発者がそれらのURLを修正する必要性を感じられるようにしたいと思いました。


:すべての無効な文字ものです:後から来たスーパーセットstackoverflow.com/questions/1547899/...は
チロSantilli郝海东冠状病六四事件法轮功

回答:


101

あたりとしてRFC 1738

安全ではない:

文字はいくつかの理由で安全ではない可能性があります。 スペース文字は安全ではありません。URLが転記またはタイプセットされるか、ワープロプログラムの処理を受けると、重要なスペースが消えたり、重要でないスペースが導入されたりする可能性があるためです。 文字"<"">"は、フリーテキストのURLの区切り文字として使用されるため、安全ではありません。"""一部のシステムでは、引用符()を使用してURLを区切ります。文字"#"は安全ではなく、常にエンコードする必要があります。WorldWide Webやその他のシステムでは、それに続くフラグメント/アンカー識別子からURLを区切るために使用されるためです。キャラクター"%"他の文字のエンコーディングに使用されるため、安全ではありません。他の文字は安全ではありません。ゲートウェイや他のトランスポートエージェントがそのような文字を変更することがあることが知られているためです。これらの文字は"{""}""|""\"、、 、、と。"^""~""[""]""`"

安全でない文字はすべてURL内で常にエンコードする必要があります。たとえば、"#"通常はフラグメントまたはアンカー識別子を処理しないシステムであっても、URL内で文字をエンコードする必要があるため、URLをそれらを使用する別のシステムにコピーした場合、URLエンコーディングを変更する必要はありません。


2
1738は2396に置き換えられました。ietf.org/ rfc / rfc2396.txtこれが現在のUri仕様です。ただし、この場合は問題ではありません。
Steve Severance、

40
また、2396は3986に置き換えられました。RFCは不変であるため、多くの人がこれを誤解しているため、廃止されたと読者に伝えていません。ヒント:代わりにtools.ietf.org/html/rfc2396などのtools.ietf.org/html/rfcnnnnを使用してください。不足しているメタデータが上部に表示されます。
Julian Reschke、2009

43

なぜエンコードする必要があるのですか?リクエストは次のようになります。

GET /url HTTP/1.1
(Ignoring headers)

空白で区切られた3つのフィールドがあります。あなたのURLにスペースを入れた場合:

GET /url end_url HTTP/1.1

4つのフィールドがあることがわかっている場合、HTTPサーバーはそれが無効な要求であることを通知します。

GET /url%20end_url HTTP/1.1

3つのフィールド=>有効

注:クエリ文字列(?の後)では、スペースは通常+としてエンコードされます

GET /url?var=foo+bar HTTP/1.1 

のではなく

GET /url?var=foo%20bar HTTP/1.1 

varが「foo + bar」であり、「foo bar」ではない場合はどうなりますか?
Ivo3185 2015

2
これは、URI仕様自体ではなく、トランスポート層の要件であると私は主張します。GETは明らかにURL仕様ではなく、http:仕様のプロパティです。同様に、URL内の引用符はエンコードする必要があると主張できます。そうしないと、Webページが壊れてしまうからです。ただし、これはHTMLのフォーマット制限のプロパティであり(に対して他の戦略があります)、URL仕様のプロパティではありません。
ケントフレドリック

ietf.org/rfc/rfc1738.txt-スペースを含む安全でない文字)をエンコードする必要があります
Julien

@KentFredricこれは、トランスポート層ではなく、プレゼンテーション層である可能性が高くなります。以下のようジュリアン(ほぼ)書き込み、オリジナルのURI仕様(RFC 1630は、それは関係なく、あなたの個人的な感情のURI仕様自体の一部ですので)、この制限が含まれています。URI仕様はHTTPドラフトのに作成されため、URI はスペースの使用の禁止を含め、HTTPを考慮して設計された可能性が非常に高いですが、実際には問題ではありませんか。真実はスペックがスペックであるということです。
クリストファーシュルツ

38

より短い答え:いいえ、スペースをエンコードする必要があります。スペースをとしてエンコードすること正しい+ですが、クエリ文字列でのみです。パスで使用する必要があります%20


1
こんにちは、私も混乱しています。本が「+」を使用しているのを見たことがありますが、「%20」を使用していることがあります。この例をいくつか示していただけますか?ユーザーがフォームを送信すると、フォームはどのようにスペースをエンコードしますか?どのキャラクターと?
GMsoF

1
詳細については、この回答を参照してください。
DavidRR

フラグメント/ハッシュ部分はどうですか?そこではどのようにスペースをエンコードする必要がありますか?
ガムキン14

@gumkins:フラグメント(#以降)はサーバーに送信されません。実際には、%20または+をどこでも使用してスペースをエンコードできます。
ジュリアン

9

URLはRFC 3986で定義されていますが、他のRFCも関連していますが、RFC 1738は廃止されています

他の多くの文字と一緒に、スペースを含めることはできません。それらの禁止された文字はしばしば何らかの形で表現される必要があるため、「%」接頭辞を使用してASCIIの16進数に変換することにより、それらをURLにエンコードするスキームがあります。

ほとんどのプログラミング言語/プラットフォームは、URLをエンコードおよびデコードする機能を提供しますが、RFC標準に適切に準拠していない場合があります。たとえば、PHPではそうではないことを知っています。


7

はい、ただし、スペースは通常「%20」にエンコードされます。安全上の理由から、URLに渡すパラメータはすべてエンコードする必要があります。


6

URLにはスペース文字を含めることができ、ほとんどのブラウザでは%20として表示されますが、ブラウザのエンコードルールは頻繁に変更され、ブラウザがURLを表示する方法に依存することはできません。

そのため、代わりに、URLのスペース文字を、URLをより読みやすくし、 'Pretty'にすると思われる任意の文字に置き換えることができます。 "+" ....しかし、これらは強制ではないので、URLに含まれていないはずの任意の文字を使用できます。

%、&、}、{、]、[、/、>、<は、特定のブラウザやプラットフォームでエラーを引き起こす可能性があるため、URLスペース文字の置換として使用しないでください。

ご覧のとおり、Stakオーバーフロー自体はスペース(%20)の置換として「-」文字を使用しています。

幸せな質問をしてください。


5

URLにはスペースを入れないでください。対処する必要がある場合は、そのエンコードされた値を使用します%20


5

スペースのあるURLはエンコードする必要があることを示すRFCを誰かが指すことができますか?

URI、つまりURLはRFC 3986で定義されています。

そこに定義されている文法を見ると、スペース文字は構文的に正当なURLの一部にはなり得ないことに気付くでしょう。したがって、「スペースのあるURL」という用語はそれ自体が矛盾しています。


3

あなたの質問に答えるために。アプリケーションでURLで使用される値のスペースを置き換えることはかなり一般的だと思います。これは、通常、発生するパーセント(URI)エンコーディングの読み取りが困難になるのを避けるためです。

パーセントエンコーディングに関するウィキペディアの記事をご覧ください。


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