* 仕様書

[REFS[
- [21] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-03-14 22:44:13 +09:00]] 版) <https://html.spec.whatwg.org/#dom-location-pathname>
]REFS]

* 意味

[56] [[URL path]] の意味と構文は、 [[URL scheme]] ごとに異なります。
詳しくは各 [[URL scheme]] の項を参照。

[55] [[HTTP]] での利用については、[[HTTP(S) scheme]] を参照。

[58] [[URL設計]]も参照。


* 比較

[9] [[Path]] に関する[[比較演算]]として [[path一致]]があります。

[11] [[ディレクトリーの比較]]

[48] [[PathMatch]], [[PatternMatch]]

* プロトコル

[19] 
[FIG(list middle)[
- [CODE(HTTP)@en[Path]] [[属性]] ([[Cookie]])
- [CODE(JS)@en[location.pathname]] ([[DOM]])
- [CODE(HTTP)@en[:path]] [[擬似ヘッダー]] ([[HTTP/2]])
]FIG]

* [CODE(DOMi)@en[Location]] インターフェイス [CODE(DOMa)@en[pathname]] 属性

** 性質

[23] この[[属性]]は、 [CODE(xattr IDL)@en[Unforgeable]] です [SRC[>>21]]。

** 取得器

[25] [CODE(JS)@en[location.pathname]] の[[取得器]]は、次のようにしなければ[MUST[なりません]]
[SRC[>>21]]。

[FIG(steps)[
= [24] [[文脈オブジェクト]]の[F[[[関係する[CODE(DOMi)@en[Document]]]]]]の[F[起源][文書の起源]]と[[入口設定群オブジェクト]]の[F[起源]]が[[同じ起源ドメイン]]でなければ、
== [26] [CODE(DOMe)@en[SecurityError]] [[例外]]を[[投げ]]、ここで停止します。
= [27] [VAR[URL]]を、[[文脈オブジェクト]]の[F[URL][Location (DOM)]] に設定します。
= [28] [VAR[URL]]の[F[非相対フラグ]]が設定されていれば、
== [29] [VAR[URL]]の[F[path]]の最初の[[文字列]]を返します。
= [52] それ以外で、 [VAR[URL]] の[F[パス][URL path]]が[[空]]なら、
== [53] [[空文字列]]を返します。
= [30] それ以外なら、
== [31] [VAR[結果]]を、 [CODE[/]] に設定します。
== [32] [VAR[URL]]の[F[path]]の各[[文字列]][VAR[文字列]]について、順に、
=== [33] [VAR[結果]]の末尾に [CODE[/]] を追加します。
=== [34] [VAR[結果]]の末尾に[VAR[文字列]]を追加します。
== [35] [VAR[結果]]を返します。
]FIG]

** 設定器

[36] [CODE(JS)@en[location.pathname]] の[[設定器]]は、次のようにしなければ[MUST[なりません]]
[SRC[>>21]]。

[FIG(steps)[
= [43] [VAR[入力]]を、与えられた値を [CODE(IDL)@en[USVString]] として解釈した結果に設定します。
= [37] [[文脈オブジェクト]]の[F[[[関係する[CODE(DOMi)@en[Document]]]]]]の[F[起源][文書の起源]]と[[入口設定群オブジェクト]]の[F[起源]]が[[同じ起源ドメイン]]でなければ、
== [38] [CODE(DOMe)@en[SecurityError]] [[例外]]を[[投げ]]、ここで停止します。
= [39] [VAR[複製]]を、[[文脈オブジェクト]]の[F[URL][Location (DOM)]] に設定します。
= [40] [VAR[複製]]の[F[cannot-be-a-base-URL flag]]が設定されていれば、ここで停止します。
= [41] [VAR[入力]]に[[基本URL構文解析]]を適用します。
[VAR[URL]] は[VAR[複製]]、[VAR[状態上書き]]は [[path start state]] とします。
= [42] [[文脈オブジェクト]]と [VAR[複製]]について
[[[CODE(DOMi)@en[Location]]-object-setter navigate]] を実行します。
]FIG]

* 関連

[10] [CODE(URI)@en[[[/]]]] から始まる [[path]] を[[絶対パス]]といいます。

* 歴史

- [1] [CODE(ABNF)[[DFN[path]]        = [[fsegment]] *( "/" [[segment]] ) ;; [[RFC 1808]]]]
- [5] [CODE(ABNF)[[DFN[path]] := [ abs_path / opaque_part ] ;; [[RFC 2396]]]]

[4] RFC 1808 の [CODE(ABNF)[path]] は、 2396 では [CODE(ABNF)[[[path_segments]]]] に当たります。

[2] >>1 [CODE(ABNF)[[DFN[fsegment]] := 1*[[pchar]]]], [CODE(ABNF)[[DFN[segment]] := *pchar]] です。
最初の部分が必ず1文字ないといけないのは、
空を許すとすると [CODE(ABNF)[[[abs_path]]]] で 
[SAMP(URI)[//foo]] のようなものが認められることなり、 
[CODE(ABNF)[[[net_path]]]] と区別できなくなってしまうからでしょう。

[3] [[RFC 2396]] では、 [CODE[<path>]] は 
[CODE(ABNF)[[[abs_path]]]] 又は [CODE(ABNF)[[[opaque_part]]]]
のことを指します。これらは排他的なので曖昧なく区別できます。
(RFC 2396 3.)

[6] 2396 によれば、 path segment では [CODE(regex)[ [/;=?] ]] 
が[[予約]]されています。 [CODE(URI)[=]] 
は[[引数]]で使われるのですが、
最初の引数のセミコロンより前では意味を持たないはずです。
それでも予約されています。

あ、よくみると、引数でも [CODE(URI)[=]] は定義されていませんね。
つまり、引数だろうがなかろうが、経路 segment 内では 
[CODE(URI)[=]] と [CODE(URI)[%3D]] は必ずしも等価ではなく、
うかつに (un)escape してはいけないということです。

[7]
[CITE[The Path URN Specification]] ([CODE[1999-03-16 02:27:52 +09:00]] 版) <http://www.hypernews.org/~liberte/www/path.html>
([[名無しさん]])

[8]
<urn:ietf:id:draft-ietf-uri-urn-path-01>

[FIG(quote)[
[FIGCAPTION[
[12] [CITE[DUPLICITY(1) manual page]]
([TIME[2015-05-07 01:40:02 +09:00]] 版)
<http://duplicity.nongnu.org/duplicity.1.html#sect7>
]FIGCAPTION]

> In protocols that support it, the path may be preceded by a single slash, ’/path’, to represent a relative path to the target home directory, or preceded by a double slash, ’//path’, to represent an absolute filesystem path.

]FIG]

[20] [CITE[JavaScript - IEはanchorタグのpathnameとlocationのpathnameで違う値を返す - Qiita ''''''[''''''キータ'''''']'''''']]
( ([TIME[2013-09-17 05:16:32 +09:00]] 版))
<http://qiita.com/opengl-8080/items/b582bdc2b5923e7ca2aa>

** [CODE(XMLe)@en[cloud]] 要素 [CODE(XMLa)@en[path]] 属性

[13] [[RSS]] の [CODE(XMLe)@en[[[cloud]]]] [[要素]]の
[DFN[[CODE(XMLa)@en[[[path]]]] [[属性]]]]は、
[[Webサービス]]の[[経路]]を表します
[SRC@en[[[RSS Best Practices Profile]]]]。

[14] 仕様書:
[REFS[
- [15] [CITE@en[RSS Best Practices Profile]] ([TIME[2008-11-21 15:11:45 +09:00]] 版) <http://www.rssboard.org/rss-profile#element-channel-cloud>
]REFS]

[2] この[[属性]]は [[RSS 2.0]] でも定義されていましたが、
存在すること以外は何も規定されていませんでした。

[16] [CODE(XMLe)@en[cloud]] [[要素]]は [[XML-RPC]] または [[SOAP]]
の接続先を指定することになっています。 [CODE[path]] [[属性値]]はそのうち
[[path]] 部分を表すもので、事実上、 [[HTTP]] の [[URL]] の [F[path]]
を指定するものです。

;; [17] 理論上 [[SOAP]] は [[HTTP]] 以外でも使うことができますが、
[[RSS]] がそれを想定しているかどうかは疑問で、 [[HTTP]] 以外の場合に 
[CODE[path]] [[属性]]に何を指定するのかはよくわかりません。

[22] この[[属性]]は必須です [SRC@en[[[RSS Best Practices Profile]]]]。

[18] 現在も [[RSS]] の仕様書には含まれていますが、
もはや誰も使っておらず、実質的に[[廃止]]状態にあります。

[44] [CITE@en[Editorial: non-relative flag got renamed · whatwg/html@d360c27]]
([TIME[2016-03-31 12:37:54 +09:00]] 版)
<https://github.com/whatwg/html/commit/d360c27d44c52390441b5910d39e898160ec016d>

[45] [CITE@en[Merge effective script origin into origin · whatwg/html@8a843f2]]
([TIME[2016-03-31 18:09:32 +09:00]] 版)
<https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275>

[46] [CITE@en[EE: Path matching fix (#167)]]
([[Sun77789]]著, [TIME[2016-12-13 18:18:49 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/30d0b902eab1c8ade6f6cba50aed608a5ae090b4>

[47] [CITE@en[Editorial: clarify the "shorten a path" algorithm]]
([[domenic]]著, [TIME[2016-12-20 03:21:52 +09:00]])
<https://github.com/whatwg/url/commit/65dcfbc17248fa761904dff42e4bd1efcff3a30f>

[49] [CITE@en[Stop decoding all %2e's in paths]]
([[annevk]]著, [TIME[2016-10-28 20:46:47 +09:00]])
<https://github.com/whatwg/url/commit/fbff6834a8a03576261f777d0e0afea5c1bc5a09>

[50] [CITE@en[Change path parsing for non-special URLs]]
([[annevk]]著, [TIME[2017-01-31 19:41:51 +09:00]])
<https://github.com/whatwg/url/commit/b087fe2ab215caf656a94b067c9a69ae78f03c8f>

[51] [CITE@en[Align <a>/<area>/Location's pathname getter with the URL Standard]]
([[TRowbotham]]著, [TIME[2017-02-08 03:46:57 +09:00]])
<https://github.com/whatwg/html/commit/037e082d30b21271bd410fc2f45d2b4f0bcbce9d>

[54] [CITE@en[Editorial: use the Infra Standard for URL's path]]
([[annevk]]著, [TIME[2017-02-10 02:32:12 +09:00]])
<https://github.com/whatwg/url/commit/2f99502dc12b781f5bf6a062257ba031c7129c1e>

[57] [CITE@en[Single and double dot segments in paths cannot be represented – Premature decoding of %2e character sequences. · Issue #281 · whatwg/url]]
([TIME[2017-03-28 20:25:51 +09:00]])
<https://github.com/whatwg/url/issues/281>

[FIG(quote)[
[FIGCAPTION[
[59] [CITE@ja[記事を配信するディレクトリを変更する - はてなブログ ヘルプ]]
([TIME[2017-06-05 14:05:44 +09:00]])
<http://help.hatenablog.com/entry/import/directory>
]FIGCAPTION]

> 他のサービスやソフトウェアからブログを移転する際に、記事を配信するディレクトリを変更できます。
> 記事を配信するディレクトリとは、はてなブログの記事URL(例えばexample.hatenablog.com/entry/2016/09/01/000000)のうち、ドメイン名に続くentryの部分です。

]FIG]


[FIG(quote)[
[FIGCAPTION[
[60] [CITE@ja[はてなブログの記事URLのカスタマイズで入力できない文字 - すなばいじり]]
([TIME[2017-06-05 14:43:23 +09:00]])
<http://psn.hatenablog.jp/entry/2017/01/10/233001>
]FIGCAPTION]

> 記事のディレクトリを空欄で設定して、記事の「カスタムURL」の先頭に「entry/」を追加したURLにすると、記事が読めなくなってしまう。

]FIG]


[61] [CITE@ja[はてなブログで「記事(/entry/)」のディレクトリが変更できるようになった - すなばいじり]]
([TIME[2017-06-05 14:44:51 +09:00]])
<http://psn.hatenablog.jp/entry/2016/09/01/160001>

[FIG(quote)[
[FIGCAPTION[
[62] [CITE@ja[ブラウザのキャッシュを活用する  |  PageSpeed Insights  |  Google Developers]]
([TIME[2014-04-12 05:27:25 +09:00]])
<https://developers.google.com/speed/docs/insights/LeverageBrowserCaching?hl=ja#url->
]FIGCAPTION]

> たとえば、「my_stylesheet.css」というリソースがあるとします。このファイル名を「my_stylesheet_fingerprint.css」に変更できます。リソースが変更されると、フィンガープリントも変更されるため、URL も変わります。URL が変更されるとすぐに、ブラウザはリソースの再取得を強制されます。フィンガープリントを使用すると、頻繁に変更されるリソースでも、有効期限をそれより先の方の日付に設定できるようになります。
> フィンガープリントの一般的な方法として、ファイルのコンテンツのハッシュをコード化した 128 ビットの 16 進数が使用されます。
> もう 1 つの方法は、アプリケーションの新しいバージョンごとに新しいリリース ディレクトリを作成して、各バージョンのすべてのアセットをバージョン別のディレクトリに格納することです。

]FIG]


[FIG(quote)[
[FIGCAPTION[
[63] [CITE@ja[固定ページを作成できるようにしました(はてなブログPro) - はてなブログ開発ブログ]]
([TIME[2017-06-27 17:29:32 +09:00]])
<http://staff.hatenablog.com/entry/2017/06/27/152000>
]FIGCAPTION]

> ページを作成するには、まずその「URL」を指定します。URLは、はてなブログの通常の記事のカスタムURLと同じように指定できますが、記事の配信ディレクトリー(デフォルトではentry)を含まないパスを自由に作成できます。
> ※はてなブログのシステムで使用しているaboutやarchiveといったパス名の固定ページを作成することもできますが、表示する際にはシステムのパスが優先されます。

]FIG]


[64] [CITE@en[Navigation scope: Avoid using pathname field.]]
([[mgiuca]]著, [TIME[2017-07-26 16:16:41 +09:00]])
<https://github.com/w3c/manifest/commit/c5d899cf9b04e8166ffb1f1a7ea2cb8cf8f5d0ca>

[FIG(quote)[
[FIGCAPTION[
[65] [CITE@en[Markers  |  Maps JavaScript API  |  Google Developers]]
([TIME[2022-01-11T22:50:50.000Z]], [TIME[2022-01-12T07:06:58.988Z]])
<https://developers.google.com/maps/documentation/javascript/markers?hl=ja>
]FIGCAPTION]

> You can define a custom path using SVG path notation, or use one of the predefined paths in google.maps.SymbolPath.

]FIG]
