SlideShare a Scribd company logo
@Hiraku
(中野 拓)
   @Hiraku (中野 拓)
    ◦ PHP歴5年ぐらい

    ◦ Zend Framework, Yaf

    ◦ http://blog.tojiru.net/
    ◦ https://github.com/hirak
URL設計の話
   http://example.com/index.php?action=hoge
    とかだとダサい

   短くてCoolなURLにしたい
    http://twitter.com/Hiraku

   しかし短すぎると
    将来の拡張性が…
   SEO対策がどうとか
仕様を読みましょう
他にもURLに関するRFC
                         があるけど、これが最新




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


http://www.studyinghttp.net/rfc_ja/rfc3986
(橋本英彦氏による日本語訳)
{scheme}:{authority}{path}?{query}#{fragment}

http://example.com/a/b/c.php?q=v#foo
{scheme}:{authority}{path}?{query}#{fragment}

http://example.com/a/b/c.php?q=v#foo

固定       ドメイン                  パラメータ的な使い方
        考えるだけ




                    ???
path            =   path-abempty    ;   "/" で始まるか、空
                /   path-absolute   ;   "/" で始まるが、"//" では始まらない
                /   path-noscheme   ;   コロンの無い segment で始まる
                /   path-rootless   ;   segment で始まる
                /   path-empty      ;   文字が無い

path-abempty    =   *( "/" segment )
path-absolute   =   "/" [ segment-nz *( "/" segment ) ]
path-noscheme   =   segment-nz-nc *( "/" segment )
path-rootless   =   segment-nz *( "/" segment )
path-empty      =   0<pchar>

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 / ":" / "@
   使ってよい文字
    ◦ 非予約文字(unreserved-character)
     [0-9A-Za-z._~-]

    ◦ %エンコードされた文字

    ◦ 予約文字のうちのsub-delims
     [!$&'()*+,;=]

    ◦ 予約文字のうちのgen-delimsの一部
     [@/:]
0 1 2 3 4 5 6 7 8 9
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
. _ ~ -
! $ & ' ( ) * + , ; =
@ / :
URLに使える文字は
英数字と / だけ
ではない!!
デモ
0 1 2 3 4 5 6 7 8 9
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
. _ ~ -
! $ & ' ( ) * + , ; =
@ / :

            四則演算
           できるよね
   http://calc.tojiru.net/1+2
   http://calc.tojiru.net/2-1
   http://calc.tojiru.net/(1+2)*10/2

   URLとして妥当

   リクエストすると計算結果がtext/plainで返って
    くる
0 1 2 3 4 5 6 7 8 9
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
. _ ~ -
! $ & ' ( ) * + , ; =
@ / :

            PHP!?
   /$a=1;$b=2;echo($a+$b);
   /$a=array(1,2,3);echo(implode(':',$a));

<?php
$code = ltrim($_SERVER['REQUEST_URI'], '/');
eval($code);

$ php -S localhost:8080 index.php

   ローカルで実験しましょうね
   スペースが書けないのでclassやfunctionが無理
   echoは()が必要になる
   []が書けないので添え字アクセスも無理
   "も書けない

   できないところも多い
実践的な話
   縛りプレイ
    ◦ 使っている文字が少なすぎる

    ◦ /と[0-9A-Za-z._-]だけでURL作るとか厳しい

    ◦ /は「階層」の意味合いを感じてしまう
   /map/lat/50/long/20/scale/32000
   こういうURL設計を強要するフレームワーク、
    よくあるよね

    ◦ lat(経度)とlong(緯度)は階層じゃない
    ◦ lat/50とlong/20を入れ替えても動作する方がいい

   /map?lat=50&long=20&scale=32000

    ◦ 入れ替え可能だし階層っぽさは消えた
   Tim Berners-Leeによる提案
    http://www.w3.org/DesignIssues/MatrixURIs.html

   /map;lat=50;long=20;scale=32000

    ◦ セミコロンによるqueryと同等の記述
    ◦ queryを使っていないところに意味がある
   /user;id=123/friends

    ◦ 後ろに階層を続けることができる
    ◦ クエリはURL中一度しか使えないので、
      Matrix URIの方が拡張性高い

    ◦ パスの途中にパラメータを仕込む構文が可能
      →覚えておくと何かと便利
まとめ
   URLの記述力はすごい

   "/" 以外のsub-delimsを使えば世界が広がる

   みんなもっとURLで遊べばいい
   別に「URL設計はこうあるべき」とか論じる気は
    ない
    ◦ そんなのサービスによって変わるし

   その前に選択肢を知るべきだ

   自分で制限して自分で苦しむなんて、バカみたい
    じゃないか

More Related Content

URLで遊ぼう

  • 2. @Hiraku (中野 拓) ◦ PHP歴5年ぐらい ◦ Zend Framework, Yaf ◦ http://blog.tojiru.net/ ◦ https://github.com/hirak
  • 4. http://example.com/index.php?action=hoge とかだとダサい  短くてCoolなURLにしたい http://twitter.com/Hiraku  しかし短すぎると 将来の拡張性が…  SEO対策がどうとか
  • 6. 他にもURLに関するRFC があるけど、これが最新 RFC3986 http://www.ietf.org/rfc/rfc3986.txt http://www.studyinghttp.net/rfc_ja/rfc3986 (橋本英彦氏による日本語訳)
  • 8. {scheme}:{authority}{path}?{query}#{fragment} http://example.com/a/b/c.php?q=v#foo 固定 ドメイン パラメータ的な使い方 考えるだけ ???
  • 9. path = path-abempty ; "/" で始まるか、空 / path-absolute ; "/" で始まるが、"//" では始まらない / path-noscheme ; コロンの無い segment で始まる / path-rootless ; segment で始まる / path-empty ; 文字が無い path-abempty = *( "/" segment ) path-absolute = "/" [ segment-nz *( "/" segment ) ] path-noscheme = segment-nz-nc *( "/" segment ) path-rootless = segment-nz *( "/" segment ) path-empty = 0<pchar> 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 / ":" / "@
  • 10. 使ってよい文字 ◦ 非予約文字(unreserved-character) [0-9A-Za-z._~-] ◦ %エンコードされた文字 ◦ 予約文字のうちのsub-delims [!$&'()*+,;=] ◦ 予約文字のうちのgen-delimsの一部 [@/:]
  • 11. 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz . _ ~ - ! $ & ' ( ) * + , ; = @ / :
  • 14. 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz . _ ~ - ! $ & ' ( ) * + , ; = @ / : 四則演算 できるよね
  • 15. http://calc.tojiru.net/1+2  http://calc.tojiru.net/2-1  http://calc.tojiru.net/(1+2)*10/2  URLとして妥当  リクエストすると計算結果がtext/plainで返って くる
  • 16. 0 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz . _ ~ - ! $ & ' ( ) * + , ; = @ / : PHP!?
  • 17. /$a=1;$b=2;echo($a+$b);  /$a=array(1,2,3);echo(implode(':',$a)); <?php $code = ltrim($_SERVER['REQUEST_URI'], '/'); eval($code); $ php -S localhost:8080 index.php  ローカルで実験しましょうね
  • 18. スペースが書けないのでclassやfunctionが無理  echoは()が必要になる  []が書けないので添え字アクセスも無理  "も書けない  できないところも多い
  • 20. 縛りプレイ ◦ 使っている文字が少なすぎる ◦ /と[0-9A-Za-z._-]だけでURL作るとか厳しい ◦ /は「階層」の意味合いを感じてしまう
  • 21. /map/lat/50/long/20/scale/32000  こういうURL設計を強要するフレームワーク、 よくあるよね ◦ lat(経度)とlong(緯度)は階層じゃない ◦ lat/50とlong/20を入れ替えても動作する方がいい  /map?lat=50&long=20&scale=32000 ◦ 入れ替え可能だし階層っぽさは消えた
  • 22. Tim Berners-Leeによる提案 http://www.w3.org/DesignIssues/MatrixURIs.html  /map;lat=50;long=20;scale=32000 ◦ セミコロンによるqueryと同等の記述 ◦ queryを使っていないところに意味がある
  • 23. /user;id=123/friends ◦ 後ろに階層を続けることができる ◦ クエリはURL中一度しか使えないので、 Matrix URIの方が拡張性高い ◦ パスの途中にパラメータを仕込む構文が可能 →覚えておくと何かと便利
  • 25. URLの記述力はすごい  "/" 以外のsub-delimsを使えば世界が広がる  みんなもっとURLで遊べばいい
  • 26. 別に「URL設計はこうあるべき」とか論じる気は ない ◦ そんなのサービスによって変わるし  その前に選択肢を知るべきだ  自分で制限して自分で苦しむなんて、バカみたい じゃないか