Upload
hiraku-nakano
View
8.855
Download
4
Embed Size (px)
DESCRIPTION
第62回PHP勉強会で発表した内容です
Citation preview
URL で遊ぼう@Hiraku
( 中野 拓 )
@Hiraku ( 中野 拓 )◦ PHP 歴 5 年ぐらい
◦ Zend Framework, Yaf
◦ http://blog.tojiru.net/◦ https://github.com/hirak
自己紹介
URL 設計の話
URL 設計悩むよね http://example.com/index.php?action=hoge
とかだとダサい
短くて Cool な URL にしたいhttp://twitter.com/Hiraku
しかし短すぎると将来の拡張性が…
SEO 対策がどうとか
仕様を読みましょう
RFC3986
他にも URL に関するRFC があるけど、これが
最新
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
URI(URL) の構造
{scheme}:{authority}{path}?{query}#{fragment}
http://example.com/a/b/c.php?q=v#foo
悩むのはパス
固定 ドメイン考えるだけ
パラメータ的な使い方
???
パスの仕様を読む (Sec 3.3) 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 9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. _ ~ -! $ & ' ( ) * + , ; =@ / :
超要約
声を大にして言いたい
URL に使える文字は英数字と / だけではない!!
デモ
デモ1
0 1 2 3 4 5 6 7 8 9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. _ ~ -! $ & ' ( ) * + , ; =@ / :
四則演算できるよね
http://calc.tojiru.net/1+2 http://calc.tojiru.net/2-1 http://calc.tojiru.net/(1+2)*10/2
URL として妥当
リクエストすると計算結果が text/plain で返ってくる
デモ 1 電卓 API
デモ 2
0 1 2 3 4 5 6 7 8 9ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. _ ~ -! $ & ' ( ) * + , ; =@ / :
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
ローカルで実験しましょうね
デモ 2 PHP も一部書ける
スペースが書けないので class や function が無理
echo は () が必要になる [] が書けないので添え字アクセスも無理 " も書けない
できないところも多い
デモ 2 PHP も一部書ける
実践的な話
縛りプレイ◦ 使っている文字が少なすぎる
◦ / と [0-9A-Za-z._-] だけで URL 作るとか厳しい
◦ / は「階層」の意味合いを感じてしまう
URL 設計が難しい理由
/map/lat/50/long/20/scale/32000 こういう URL 設計を強要するフレームワーク、
よくあるよね
◦ lat( 経度 ) と long( 緯度 ) は階層じゃない◦ lat/50 と long/20 を入れ替えても動作する方がいい
/map?lat=50&long=20&scale=32000
◦ 入れ替え可能だし階層っぽさは消えた
例)地図の URL を考える
Tim Berners-Lee による提案http://www.w3.org/DesignIssues/MatrixURIs.html
/map;lat=50;long=20;scale=32000
◦ セミコロンによる query と同等の記述◦ query を使っていないところに意味がある
Matrix URI
/user;id=123/friends
◦ 後ろに階層を続けることができる◦ クエリは URL 中一度しか使えないので、
Matrix URI の方が拡張性高い
◦ パスの途中にパラメータを仕込む構文が可能→覚えておくと何かと便利
Matrix URI のメリット
まとめ
URL の記述力はすごい
"/" 以外の sub-delims を使えば世界が広がる
みんなもっと URL で遊べばいい
まとめ
別に「 URL 設計はこうあるべき」とか論じる気はない◦ そんなのサービスによって変わるし
その前に選択肢を知るべきだ
自分で制限して自分で苦しむなんて、バカみたいじゃないか
言いたかったこと