Help us understand the problem. What is going on with this article?

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の仕様書とか読んだ

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away