Edited at

Mediumの『/@{username}』みたいにURLの中で『@』を使っているのは大丈夫なのか調べてみた

More than 3 years have passed since last update.

MediumのURLでユーザー名の前に『@(アットマーク)』が入っているのを見かけます。

https://medium.com/@narikei

/users/narikeiとかなっているよりもタイプ数も少ないし、直感的で良い思った

でも、他にやっているところを見ないし『@』をURLに含んでいるサービスもない

これはインターネットの仕様的に大丈夫なのか疑問だったので調べてみました。


URLおさらい

例えば、こんなURLがあった場合

https://username:password@www.example.com:8080/news/index.html?page=2&flg=true#popular

このような要素に分類される

scheme
https

host
www.example.com

port
8080

user
username

pass
password

path
/news/index.html

query
page=2&flg=true

fragment
popular

普通URLで『@』っていうとBasic認証で使うイメージです。


『@』を使っても良いか

URLの親玉URIの仕様はInternet Engineering Task Forceが策定している

その仕様書がこれ

http://www.ietf.org/rfc/rfc3986.txt

(読みにくいのでダウンロードして固定ピッチのフォントで読むのがおすすめ)

3.3.  Path

The path component contains data, usually organized in hierarchical
form, that, along with data in the non-hierarchical query component
(Section 3.4), serves to identify a resource within the scope of the
URI's scheme and naming authority (if any). The path is terminated
by the first question mark ("?") or number sign ("#") character, or
by the end of the URI.

=====

segment = *pchar
segment-nz = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
; non-zero-length segment without any colon ":"

pchar = unreserved / pct-encoded / sub-delims / ":" / "@"

私のてきとう翻訳によると、Pathには使っても大丈夫って書いてあった

さらに、「:(コロン)」も使ってもよいらしい

ちゃんとパーセントでエスケープする場合は%40を使う


そういえば

むかし、Hashbangってものもあったけど/#!は使っちゃだめ

というか#以降がfragmentとして分類される。


おわり

MediumはきちんとURIの仕様にそっていて正しかった

/@narikeiだと既存のルーティングと競合しないし、/@loginとかやられても辛さが軽減されるのでオススメかも

Railsだったら こんな感じでルーティングさせることができる


routes.rb

  get "/@:username" => "users#show"


JavaでSpringならこんな感じ


UserController.java

@Controller

@RequestMapping(value = "/@{userName}")
public class UserController {...}

ただ、すべてのブラウザやクローラーがきちんと読んでくれるかは微妙な気がします。

はじめてIETFの仕様書とか読んだ